0

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

@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");
}

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

4

1 回答 1

1

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

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

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

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

不是美女吗?

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

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

希望这是有帮助的。

于 2012-08-22T01:47:23.820 回答