0

Obviously real life applications are a lot more complex but for this example sake lets say I have the following simple view and I need to save the User:

@model UserViewModel


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

When submitted there are two ways how I can receive it at the Controller level:

1)

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

and

2)

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

Question: Is there a reason to use one method over another ? 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. Why ?

4

1 に答える 1

1

簡単な答え: 両方とも機能しており、両方とも有効です。

長い独断的な答え:私は最初のものを好みますが、

  1. 2番目のものよりもオブジェクト指向です。
  2. 2番目のアプローチでは暗黙的に魔法の文字列があります。もちろん、それらを外部化することもできますが、繰り返しになりますが、強い型は文字列ごとに移動するよりも常に優れています。
  3. オプション 1 で検証を 1 回定義すると、オプション 2 で何度も何度も行う必要があります。
  4. AutoMapper を使用できます。ほとんどのフィールドを同様の名前でマップし、残りを定義するように求めます。ここでは、フィールドごとに移動する必要はまったくありません (以下を参照)。ただし、2 番目のアプローチでは、1 つずつ行う必要があります。マッピングを行うと、次のようになります (これも簡単です)。

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

それは美しさではありませんか?

オプション 2 が 1 よりも優先される理由は本当にわかりません...彼らには理由があると思います。COBOL と C++ のようなものです。:))

しかし、これは本当に個人的な決定とスタイルです。正解はありません

これが役に立てば幸いです。

于 2012-08-22T01:47:23.820 に答える