MVC 3中如何在HttpPost操作中拆分参数

3
我有一个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中的属性。你们建议我采用这种方法吗?还是说我以后会遇到麻烦?


泛型是很好的,但时常会导致过度工程化。你想要达到什么目的呢?关于命名规范,我认为你的同事是正确的,但只是称其为视图模型只解决了一半的问题。我希望能够通过查看类的名称和属性来确定其用途。 - user338195
导航视图模型是一种携带各种信息的工具,例如哪个按钮被按下以引起后续操作,以及是否要显示按钮(我们正在设计非常动态和奇怪的流程)。我可以重复使用这部分并让T,即视图模型,可互换。称其为视图模型可能不会更清晰,但它让我发现您可以使用/滥用/欺骗模型绑定器来解析两个对象而不是带有内部对象的包装器。 - Vincent
这听起来像是一个设计问题。如果我理解有误,请纠正我,但您是想追踪用户正在使用的页面状态。如果是这样的话,那么Web表单可能是更好的解决方案。而且,在MVC中听到“post-backs”似乎不太对。也许尝试分享更多关于您的设计的信息?无论如何,这非常有趣,很高兴看到更多意见。 - user338195
我有一个“下一个”、“上一个”和“概览”按钮,根据整个对象(在服务器的某个地方,我们称之为Foo)的状态,我决定是否让某人看到这些按钮。问题是,有各种各样的Foos,它们共享相同的属性,但不共享相同的行为。给定其属性的相同状态,FooA确实有一个“上一个”按钮,但FooB没有。而且,“postback”可能是WebForms的遗留问题,我应该说“提交表单”。是的,交互设计至少已经非常具有“挑战性”。 - Vincent
1个回答

0

我觉得我有一个非常简单的答案,只要不要将您的操作参数命名为“viewModel”,所以更改为:


public ActionResult Foo(NavigationViewModel viewModel)


public ActionResult Foo(NavigationViewModel model)

或者使用其他参数名称,以避免在 NavigationViewModel 类中与您的 ViewModel 属性发生冲突。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接