何时使用强类型视图?

Met*_*uru 5 asp.net asp.net-mvc

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

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

谢谢.

Joh*_*zen 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; } }
}
Run Code Online (Sandbox Code Playgroud)

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

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; }
}
Run Code Online (Sandbox Code Playgroud)

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

所述控制器基类拉动用户从会话和配置了高速缓存.

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

现在,在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 { ... } }
}
Run Code Online (Sandbox Code Playgroud)

这有助于我找到所有返回视图的控制器,这些视图不是从正确的基类继承的.


Dan*_*ott 2

我尽可能使用强类型视图,这样我就可以摆脱视图中 ViewData 各个位的所有强制转换。

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

例如,在我的结账中,我需要订单,但也需要用户对价格显示的偏好;所以我创建了 CheckoutViewModel ,它具有 Order 和 PriceDisplay 属性。

希望有帮助,