【问题标题】:Passing a custom ViewModel object to an ActionMethod vs passing as FormCollection将自定义 ViewModel 对象传递给 ActionMethod 与作为 FormCollection 传递
【发布时间】:2012-08-22 00:41:47
【问题描述】:

显然现实生活中的应用程序要复杂得多,但对于这个例子,假设我有以下简单视图,我需要保存用户:

@model UserViewModel


@Html.TextBoxFor(model=>model.FirstName)
</br>
@Html.TextBoxFor(model=>model.MiddleName)
</br>
@Html.TextBoxFor(model=>model.LastName)

提交后,我可以通过两种方式在控制器级别接收它:

1)

public ActionResult(UserViewModel user)
{
 var myUser = new User();
 myUser = user.FirstName;
 myUser = user.MiddleName;
 myUser = user.LastName;
}

2)

public ActionResult(FormCollection collection)
{
 var myUser = new User();
 myUser = collection.Get("FirstName");
 myUser = collection.Get("MiddleName");
 myUser = collection.Get("LastName");
}

问题:是否有理由使用一种方法而不是另一种方法?还有一些开发人员告诉我,首选第二种方法。像第一个示例中显示的那样传递整个对象并不是一个好主意。为什么?

【问题讨论】:

  • 我无法想象为什么会有人永远接受FormCollection,但也许有些人从编写自己的解析和验证代码中获得了不正当的乐趣再来一遍……
  • 验证..好点
  • Also a few developers told me that second method is preferred. That passing object the whole object like shown in the first example is not a good idea.。真的吗?他们开发什么?我们在谈论软件开发人员吗?还是在这个领域崭露头角的人?我相信他们为您提供了关于为什么首选第二个的 solid 论据。你可以给他们送我啤酒。
  • 我现在可以自己去喝杯啤酒。:) 谢谢大家。

标签: asp.net-mvc model-view-controller formcollection


【解决方案1】:

简短的回答:两者都在工作并且都有效。

固执己见的回答:我更喜欢第一个,

  1. 比第二个更面向对象
  2. 您在第二种方法中隐含了魔术字符串。当然,您可以将它们外部化等,但同样,强类型总是比逐个字符串更好。
  3. 您在选项 1 中定义了一次验证,您必须在选项 2 中一遍又一遍地进行。
  4. 可以使用 AutoMapper。它将为您映射具有相似名称的大部分字段,并要求您定义其余字段。在这里,您根本不必逐个字段移动(见下文)。但是,您必须在第二种方法中一一进行。 当您完成映射时,它看起来像这样(这也很简单):

    public ActionResult(UserViewModel user)
    {
       var myUser = Mapper.Map<User, UserViewModel>(user);
    }
    

这不是美女吗?

我真的不明白为什么选项 2 比 1 更受欢迎... 我想他们有他们的理由。它就像 COBOL 与 C++。 :))

但这确实是个人决定和风格没有正确答案

希望对您有所帮助。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-07-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多