我有一个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有另一个名为Model的属性。他建议将Model属性重命名为ViewModel,我同意他的推理。
现在,具有重命名属性的代码不再起作用:NavigationViewModel viewModel为null。所以我将HttpPost方法的签名更改为以下内容并再次起作用:
[HttpPost]
public ActionResult Foo(NavigationHelper helper, Bar viewModel)
我非常喜欢这个!我可以直接在代码中访问我的viewModel,视图中的代码是有意义的,帮助对象不会妨碍。我以前没有见过这个约定,因为命名约定,我认为它之前有用。使用名为Model的属性暗示了如何解析对象。没有该属性,它就无法解决它。
我想将这个用于包含特定于视图的属性的其他类型的帮助程序,例如select-lists或其他我可能放在ViewBag中的属性。你们会推荐这种方法,还是在以后使用它时会遇到麻烦?
答案 0 :(得分:0)
我想我有一个非常简单的答案,只是不要命名你的动作参数viewModel,所以改变:
public ActionResult Foo(NavigationViewModel viewModel)
public ActionResult Foo(NavigationViewModel model)
或者任何其他参数名称不会与NavigationViewModel类上的ViewModel属性发生冲突。