MVC 3在HttpPost动作中拆分参数

时间:2012-03-26 12:00:26

标签: asp.net-mvc-3 http-post model-binding

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

1 个答案:

答案 0 :(得分:0)

我想我有一个非常简单的答案,只是不要命名你的动作参数viewModel,所以改变:


public ActionResult Foo(NavigationViewModel viewModel)

public ActionResult Foo(NavigationViewModel model)

或者任何其他参数名称不会与NavigationViewModel类上的ViewModel属性发生冲突。