何时使用强类型视图?

5
我正在开发一个MVC应用程序,我想知道在什么情况下最好使用强类型视图以及何时不需要... 我猜这更多是一个最佳实践问题。我正在开发一个电子商务应用程序,其中包含订单、产品等表格。引起我产生这个问题的部分是我正在为管理员添加新产品页面。如果您能提供关于如何判断何时使用强类型视图的提示,将是非常有帮助的。
我已经搜索了相关的问题,前3页没有任何结果,但如果您知道相关文章,请指导一下。
谢谢。
6个回答

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; }
}

私有构造函数强制我的模型的所有子类使用源控制器初始化模型。
控制器基类从会话中获取用户信息并从缓存中获取配置信息。这样,无论如何,我的所有视图都可以访问用户和配置数据,而不必生成数据库查询。
现在,在 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 { ... } }
}

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

John,这是否意味着您正在使用自定义的Membership提供程序? - Lazarus
嗯,听起来非常方便。我们所有的视图都是强类型的,并且我们创建了自己的MembershipProvider和MembershipUser。您如何修改主页面以保留该信息? - Jedidja
1
更新了我是如何做到这一点的细节。 - John Gietzen
大多数更新都很有意义,直到涉及到具有ControllerResponse类型的代码 - 这是从哪里来的? :) - Jedidja
ControllerResponse本来是MyBaseModel,我为了澄清而将其重命名,但忘记修改了那个地方。已修复。 - John Gietzen
谢谢分享 :) 我也打算尝试使用你的方法。 - Jedidja

3

如果涉及到数据,就应该使用强类型视图。没有讨论的余地。


2

每当我可以使用强类型视图时,我都会使用它,这样我就可以避免在视图中转换各种 ViewData 的属性。

每当我需要从多个来源获取信息以供视图使用时,我都会创建自己的强类型视图。

例如,在我的 Checkout 中,我需要一个订单,还需要用户的价格显示偏好设置;因此,我创建了一个名为 CheckoutViewModel 的类,该类具有 Order 和 PriceDisplay 两个属性。

希望这可以帮到你,

Dan


1

一直以来,我都会更进一步地使用强类型控件和HtmlHelper操作。大多数这样的工具都可以在MVCContrib库中找到。


0

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

例如,当您在视图中编辑或创建产品时,建议为产品类使用强类型视图。

如果您仅显示文本或图像而实际上没有与底层数据库层中的任何内容连接,则可能更容易不使用强类型视图。

随着您在MVC中的工作经验增加,这些都会变得自然而然。


0

虽然我在重复其他人已经表达得很好的观点,但我认为还有一个要提出的观点。视图是模型、视图、控制器概念的一部分,因此它的作用是以可视化的方式向用户呈现模型。鉴于它本质上是模型的表示,让它具有强类型是有意义的。

我只会使用ModelState或TempState来传递小块数据,例如来自添加、删除等活动的结果消息。每当我发现自己想使用State来传递与View类型无关的集合时,我就会将该功能重构为一个部分视图,并通过单独的控制器操作呈现它。

在我的代码中,相关类型通常从基础类型按层次结构引用到View强类型的基础类型,因此在必要时可以在View中访问它们。


我认为“ModelState或TempState”应该改为“ViewData或TempData”。 - Craig Stuntz

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接