何时使用强类型视图?

时间:2009-09-15 14:48:05

标签: asp.net asp.net-mvc

我正在开发一个MVC应用程序,我想知道在什么情况下最好使用强类型视图,什么时候不...我想这更像是一个最佳实践问题。我正在制作一个电子商务应用程序,并且有一个订单,产品等的表。我正在努力的部分让我想到这个问题是我为管理员添加了一个新的产品页面以放入更多商店项目。任何提示何时知道使用强类型视图会有很大的帮助。

我已经搜索了相关问题,并且在前3页左右没有弹出任何内容,但如果你知道帖子,请指导我。

感谢。

6 个答案:

答案 0 :(得分:5)

每当您需要在视图上显示数据(在任何特定对象或对象集合上)时,请使用强类型视图。

如果您的视图纯粹是信息性的,您可以使用ModelState传递一小部分信息(例如:成功/错误页面,非授权消息等)

在我的应用程序中,我的每个视图都是强类型的,因此我可以轻松地将用户登录信息传递给母版页。也就是说,我的所有视图都是强类型,模板化和约束到包含站点配置和用户登录信息的基类。

因此,我可以这样做:

public class MyBaseMasterPage : ViewMasterPage<MyBaseModel>
{
    public string CurrentTheme
    {
        get
        {
            if (this.Model.CurrentUser != null)
                return this.Model.CurrentUser.Theme;

            else return this.Model.Config.DefaultTheme;
        }
    }

    public User CurrentUser { get { return this.Model.CurrentUser; } }

    public ConfigurationRepository Config { get { return this.Model.Config; } }
}

请注意,由于母版主题仅基于模型中填充的内容,因此视图本身永远不会触发对数据库/缓存的命中。

MyBaseModel配置如下:

public class MyBaseModel
{
    private MyBaseModel() { }

    public MyBaseModel(MyBaseController controller)
    {
        this.CurrentUser = controller.CurrentUser;
        this.Config = controller.Config;
    }

    public User CurrentUser { get; private set; }

    public ConfigurationRepository Config { get; private set; }
}

私有构造函数强制我的模型的所有子类使用soruce控制器初始化模型。

控制器基类将用户拉出会话,将Config拉出缓存。

这样,无论如何,我的所有视图都可以访问用户和配置数据,而不会产生对数据库的命中。

现在,在MyBaseController中:

public class LanLordzBaseController : Controller
{
    [Obsolete]
    protected new ViewResult View(string viewName, object model)
    {
        if (model == null)
        {
            throw new ArgumentNullException("model");
        }

        if (!(model is MyBaseModel))
        {
            throw new ArgumentException("The model you passed is not a valid model.", "model");
        }

        return base.View(viewName, model);
    }

    protected ViewResult View(string viewName, MyBaseModelmodel)
    {
        if (model == null)
        {
            throw new ArgumentNullException("model");
        }

        return base.View(viewName, (object)model);
    }

    public ConfigurationRepository Config { get { ... } }

    public User CurrentUser { get { ... } }
}

这帮助我找到了所有返回视图的控制器,这些控制器没有从正确的基类继承。

答案 1 :(得分:3)

如果涉及数据,则应该有强类型视图。周期。

答案 2 :(得分:2)

我尽可能使用强类型视图,因此我可以远离视图中各种ViewData的所有演员。

每当我需要来自多个视图源的信息时,我都会创建自己的强类型视图。

例如,在我的Checkout中,我需要订单,但也需要用户的价格显示预防措施;所以我创建了CheckoutViewModel,它有一个Order和PriceDisplay属性。

希望有所帮助,

答案 3 :(得分:1)

始终。我会更进一步使用强类型控件和HtmlHelper操作。大多数都可以在MvcContrib库中找到。

答案 4 :(得分:0)

在视图中修改该类型的实例时,最好使用强类型视图。

例如,当您在视图中编辑或创建产品时,对于产品类具有强类型视图肯定是可取的。

如果您只显示文本或图像而实际上没有与基础数据库层中的任何内容建立连接,那么没有强类型视图可能会更容易。

根据我的经验,当你更多地使用MVC时,这一切都会自然而然地发生。

答案 5 :(得分:0)

虽然我正在重复其他人雄辩地说过的话,但我认为还有一点需要提出。视图是模型,视图,控制器概念的一部分,因此可以以可视方式向用户呈现模型。鉴于它本质上是模型的一种表示,因此对它进行强类型化是有意义的。

我只使用ModelState或TempState传递小块数据,比如来自add,delete等活动的结果消息。任何时候我发现我试图使用State来传递与View-type无关的集合然后我将该功能重构为部分视图并通过单独的控制器操作呈现该功能。

在我的代码中,相关类型通常从视图强类型的基类型中分层引用,因此可以在视图中根据需要进行访问。