2012-03-26 56 views
3

我有一个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中。你们会推荐这种方法,还是会在以后使用时遇到麻烦?

+0

泛型很好,但通常它们会导致过度工程。你想达到什么目的?关于命名约定,我认为你的同事是对的,但只是称它为视图模型解决了一半的问题。我希望能够通过查看其名称和属性来确定课程的目的。 – 2012-03-26 15:54:21

+0

导航视图模型是一种标记各种信息的工具,比如按下哪个按钮来引起回发,以及如果我想显示按钮(我们正在设计一个非常动态和怪异的流程)。我可以重用这部分,让视图模型T可以互换。将它称为视图模型可能没有更清晰,但它让我发现,可以使用/滥用/欺骗模型绑定器来解析两个对象,而不是使用内部对象的包装器。 – Vincent 2012-03-26 16:00:06

+0

这听起来像是设计问题。纠正我,如果我错了,但你说你想跟踪用户正在使用的页面的状态。如果是这样的话,那么Web表单可能是更好的解决方案。另外,用MVC听到“后卫”听起来是错误的。也许尝试分享有关您设计的更多信息?无论哪种方式,这是非常有趣的,它会很高兴看到更多的意见。 – 2012-03-26 16:06:48

回答

0

我觉得我对你有一个非常简单的答案,只是不命名动作参数视图模型,所以更改:


public ActionResult Foo(NavigationViewModel viewModel) 

public ActionResult Foo(NavigationViewModel model) 

或任何其他参数名称不与您的视图模型碰撞您的NavigationViewModel类的属性。