我有一个MVC 3应用程序,我创建了一个通用的包装对象,它具有一些导航属性和T的包装对象,其值我编辑/显示。MVC 3在HttpPost行动拆分参数
public class NavigationViewModel<T>
{
public T Model { get; set; }
public NavigationHelper NavigationHelper { get; set; }
public NavigationViewModel() { }
public NavigationViewModel(T model, NavigationHelper helper)
{
this.Model = model;
this.NavigationHelper = helper;
}
}
我的控制器在这样一个动作很好地解决了这个对象:
public ActionResult Foo(NavigationViewModel<Bar> viewModel)
代码在我看来是这样的:
@Html.EditorFor(model => model.Model.SomeProperty)
我的同事说,该代码是不是很好读书。我已经有了一个强类型视图,模型和这个模型有另一个叫做Model的属性。他建议将Model属性重命名为ViewModel,我同意他的推理。
现在,带有重命名属性的代码不再有效:NavigationViewModel viewModel为null。所以我改变了HttpPost方法的签名下面并再次将其工作原理:
[HttpPost]
public ActionResult Foo(NavigationHelper helper, Bar viewModel)
我喜欢这种非常感谢!我可以在代码中直接访问我的viewModel,视图中的代码很有意义,帮助对象不会妨碍。我之前没有看到过这个约定,我想这是因为命名约定以前的工作。使用一个名为Model的属性暗示了如何解析对象。没有这个财产,它不能再解决它。
我想对其他类型的助手包含特定于视图的属性,如选择列表或其他属性,否则我可能会放在ViewBag中。你们会推荐这种方法,还是会在以后使用时遇到麻烦?
泛型很好,但通常它们会导致过度工程。你想达到什么目的?关于命名约定,我认为你的同事是对的,但只是称它为视图模型解决了一半的问题。我希望能够通过查看其名称和属性来确定课程的目的。 – 2012-03-26 15:54:21
导航视图模型是一种标记各种信息的工具,比如按下哪个按钮来引起回发,以及如果我想显示按钮(我们正在设计一个非常动态和怪异的流程)。我可以重用这部分,让视图模型T可以互换。将它称为视图模型可能没有更清晰,但它让我发现,可以使用/滥用/欺骗模型绑定器来解析两个对象,而不是使用内部对象的包装器。 – Vincent 2012-03-26 16:00:06
这听起来像是设计问题。纠正我,如果我错了,但你说你想跟踪用户正在使用的页面的状态。如果是这样的话,那么Web表单可能是更好的解决方案。另外,用MVC听到“后卫”听起来是错误的。也许尝试分享有关您设计的更多信息?无论哪种方式,这是非常有趣的,它会很高兴看到更多的意见。 – 2012-03-26 16:06:48