将自定义ViewModel对象传递给ActionMethod vs传递为FormCollection

时间:2012-08-22 00:41:48

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

显然,现实应用程序要复杂得多,但为了这个例子,我可以说我有以下简单的视图,我需要保存用户:

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

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

1 个答案:

答案 0 :(得分:1)

简短回答:两者都有效,两者都有效。

长期自以为是的回答:我更喜欢第一个,

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

    public ActionResult(UserViewModel user)
    {
       var myUser = Mapper.Map<User, UserViewModel>(user);
    }
    
  5. 难道不是美女吗?

    我真的没有看到任何理由为什么选项2优先于1 ... 我猜他们有他们的理由。它就像COBOL vs. C ++。 :))

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

    希望这有帮助。