【问题标题】:MVC 3 split parameters in HttpPost actionHttpPost 操作中的 MVC 3 拆分参数
【发布时间】:2012-04-09 22:19:26
【问题描述】:

我有一个 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 属性重命名为 ViewModel,我同意他的推理。

现在,具有重命名属性的代码不再起作用:NavigationViewModel viewModel 为空。所以我将 HttpPost 方法的签名更改为以下,它又可以工作了:

[HttpPost]
public ActionResult Foo(NavigationHelper helper, Bar viewModel)

我非常喜欢这个!我可以直接在代码中访问我的 viewModel,视图中的代码是有意义的,并且辅助对象不会妨碍。我以前没有见过这个约定,我猜它以前因为命名约定而起作用。使用名为 Model 的属性暗示了如何解析对象。没有那个属性,它就无法再解决它了。

我想将它用于包含特定于视图的属性的其他类型的帮助程序,例如选择列表或其他我可能会放在我的 ViewBag 中的属性。你们会推荐这种方法还是我以后使用它会遇到麻烦?

【问题讨论】:

  • 泛型很好,但往往会导致过度设计。你想达到什么目的?关于命名约定,我认为您的同事是对的,但是仅将其称为视图模型就解决了一半问题。我希望能够通过查看类的名称和属性来识别类的用途。
  • 导航视图模型是一种标记各种信息的工具,例如按下哪个按钮导致回发以及是否要显示按钮(我们正在设计一个非常动态和奇怪的流程)。我可以重用这部分,让 T,即视图模型,可以互换。将其称为视图模型可能不会更清楚,但它让我发现您可以使用/滥用/欺骗模型绑定器来解析两个对象,而不是带有内部对象的包装器。
  • 这听起来像是设计问题。如果我错了,请纠正我,但你是说你想跟踪用户正在使用的页面的状态。如果是这种情况,那么 Web 表单可能是一个更好的解决方案。此外,使用 MVC 听到“回传”听起来是错误的。也许尝试分享有关您的设计的更多信息?不管怎样,这很有趣,很高兴看到更多的意见。
  • 我有一个下一个、上一个和概览按钮,并根据整个对象的状态(服务器上的某个地方,我们称之为 Foo),我决定是否有人应该看到其中的任何一个纽扣。问题是,有各种各样的 Foo,它们具有相同的属性,但行为不同。 FooA 确实有一个前一个按钮,但 FooB 没有,因为它们的属性状态相同。回发可能是网络表单的残余,我应该说“发布表单”。是的,交互设计至少可以说相当“具有挑战性”。

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


【解决方案1】:

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


public ActionResult Foo(NavigationViewModel viewModel)

public ActionResult Foo(NavigationViewModel model)

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

【讨论】:

    猜你喜欢
    • 2012-08-15
    • 1970-01-01
    • 2011-08-28
    • 2012-07-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-09
    • 2013-10-09
    相关资源
    最近更新 更多