Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-mvc/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Asp.net mvc 将自定义ViewModel对象传递给ActionMethod与作为FormCollection传递_Asp.net Mvc_Model View Controller_Formcollection - Fatal编程技术网

Asp.net mvc 将自定义ViewModel对象传递给ActionMethod与作为FormCollection传递

Asp.net mvc 将自定义ViewModel对象传递给ActionMethod与作为FormCollection传递,asp.net-mvc,model-view-controller,formcollection,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) 及 问题:是否有理由使用一种方法而不是另

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

@model UserViewModel


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


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

简短回答:两者都有效

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

  • 它比第二个更面向对象
  • 在第二种方法中,隐式地使用了魔术字符串。当然,您可以将它们外部化,等等,但是,强类型总是比逐个字符串好
  • 在选项1中定义验证一次,就必须在选项2中反复进行验证
  • 你可以使用AutoMapper。它将为您映射具有相似名称的大多数字段,并要求您定义其余字段。在这里,您根本不必逐个字段移动(见下文)。但是,在第二种方法中,您必须一个接一个地执行此操作。 当您完成映射时(这也是很容易做到的),它会是这样的:

    public ActionResult(UserViewModel用户)
    {
    var myUser=Mapper.Map(用户);
    }
    
  • 这不是一种美吗

    我真的不明白为什么选项2会比1更受欢迎。。。 我想他们有他们的理由。它就像COBOL vs. C++::) 但这确实是个人的决定和风格。没有正确的答案


    希望这能有所帮助。

    我无法想象为什么有人会接受
    FormCollection
    ,但也许有些人会从一遍又一遍地编写自己的解析和验证代码中获得不正当的乐趣…验证。。好的方面
    还有一些开发人员告诉我第二种方法是首选的。像第一个示例中所示的那样传递整个对象不是一个好主意。
    。真正地他们开发什么?我们谈论的是软件开发人员吗?还是在这个领域首次亮相的人?我相信他们为你提供了坚实的论据,说明为什么第二个更受欢迎。你们可以从我这里给他们送一杯啤酒。我现在可以自己去喝一杯。谢谢你们。
    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");
    }
    
    public ActionResult(UserViewModel user)
    {
       var myUser = Mapper.Map<User, UserViewModel>(user);
    }