1

私の質問: 既に view -a を強く型付けした場合、モデル オブジェクトをコントローラー ポスト メソッドからビュー - MVC 4 asp.net に戻す必要があるのはなぜですか?

例:電卓ビューがあります:

@using (Html.BeginForm())
{
    <p>Number One : @Html.TextBoxFor(m => m.numberOne)</p>
    <p>Number Two : @Html.TextBoxFor(m => m.numberTwo)</p>
        <input type="submit" value ="Addition" name="calculateOperation"  />
           <input type="submit" value ="Subtraction" name="calculateOperation" />
           <input type="submit" value ="Multiplication" name="calculateOperation" />
           <input type="submit" value ="Division" name="calculateOperation" />
}

@using (Html.BeginForm())
{
         <p>Output     : @Html.TextBoxFor(m => m.result)</p>

}

およびコントローラー:

public ActionResult Calculate(Calculator model, string calculateOperation)
{


    if (calculateOperation.Equals("Addition"))
    {
        int[] array = { 1, 12, 5, 26, 7, 14, 3, 7, 2 };
        model.result = model.numberOne + model.numberTwo;
    }
    if (calculateOperation.Equals("Subtraction"))
    {
        model.result = model.numberOne - model.numberTwo;
    }
    if (calculateOperation.Equals("Multiplication"))
    {
        model.result = model.numberOne * model.numberTwo;
    }
    if (calculateOperation.Equals("Division"))
    {
        model.result = model.numberOne / model.numberTwo;
    }


    return View(model);

}

モデル オブジェクトを返さないと、model.result の値を取得できません。

正当な理由を探しています。

4

4 に答える 4

1

モデルを返送する必要はありません。FormCollectionパラメーターを使用することもできますが、値を取得して正しい型にキャストする必要があります。

public ActionResult Calculate(FormCollection form, string calculateOperation)
{
    // Need to check if form["numberOne"] is null or empty or do a int.TryParse()
    int numberOne = int.Parse(form["numberOne"]);
}

厳密に型指定されたモデルを使用すると、asp.net mvcのモデル バインダーによって無料で取得できます。コードがすっきりして使いやすくなりました。

モデルを使用すると、検証や足場などの属性の力も得られます。検証属性を持つモデルを使用すると、ほとんどのシナリオをより明確かつ簡単に検証できます。


この場合、単にビューが必要とするため、モデルをビューに送信する必要があります。そのように設計されています。計算をどこかに保存しない場合、モデルまたはビューは計算を行ったことをどのように認識しますか? もちろん、ViewBag も使用できます。

ViewBag["result"] = model.numberOne + model.numberTwo;

そしてあなたの見解では:

<p>Output     :@Html.TextBox("result", (string)ViewBag["result"])</p>
于 2012-11-30T20:02:57.740 に答える
1

HTTP はステートレス プロトコルです。したがって、サーバーで作業を行う場合、クライアントに何かを表示したい場合は、それを送り返す必要があります。MVC の厳密に型指定されたビューは、実際にはレンダリング エンジンの上にある単なる抽象化です。

フォームを「送信」すると、HTTP POST がコントローラー アクション (http 要求) に返されます。

通話中

 return View(model) 

は、(ビューを使用して) レンダリングされた html ページを返す HTTP 応答を送信していることを意味します。あなたの場合、モデルをパラメーターとして渡すだけです。

于 2012-11-30T20:13:24.947 に答える
0

これは、ある種の説明または応答タイプのデータがある場合をカバーするためだと常に考えていました。

例えば。データベースに追加する住所を送信すると、住所の正確性をチェックするサービスが提供されます。正しい場合は永続化され、そうでない場合は修正され、元のオブジェクトの特別なフィールドに追加され、確認のために送り返されます。

于 2012-11-30T20:05:16.387 に答える
0

コントローラー メソッドがそのモデルまたは他のモデルを使用するものを返すという実際の要件はありません。その結果、どのビューとそれに関連付けられたデータを返すかを明示する必要があります。

メソッド パラメーターで何らかの ViewModel を使用する必要があると暗黙的に想定する View に、ある種のオーバーロードを追加することもできますが、それは直感的ではなく、不必要です。

于 2012-11-30T20:11:21.240 に答える