我有一个MVC 3应用程序,我创建了一个通用的包装对象,其中包含一些导航属性和T类型的封装对象,我正在编辑/显示其值。
我的控制器可以在这样的操作中很好地解析这个对象:
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为空。所以我更改了HttpPost方法的签名如下,并且它再次正常工作:
[HttpPost]
public ActionResult Foo(NavigationHelper helper, Bar viewModel)
我非常喜欢这个!我可以直接在代码中访问我的viewModel,视图中的代码有意义,并且helper对象不会妨碍我的工作。我以前没有见过这种约定,我猜以前是因为命名约定而起作用。使用一个叫做Model的属性暗示了如何解析对象。如果没有那个属性,它就无法解析它了。
我想采用这种方法来处理包含特定于视图的属性的其他类型的helper,比如选择列表或其他我本来可能放在ViewBag中的属性。你们建议我采用这种方法吗?还是说我以后会遇到麻烦?