2017-10-05 18 views
0

私はモデルから足場をつけたビューを持っています。私は、 "editfor"ヘルパータグから値を取得し、一連の計算を行い、次に結果(複数)をビューに戻す必要があります。私は明確にするために小さな例を作成しました。フォームの内容をコントローラに渡し、計算してから複数の結果を返す

この足場を作成
public class OpticalcTestViewModel 
{ 
    public double OD_Sphere { get; set; } 
    public double OD_Cylinder { get; set; } 
    public int Axis { get; set; } 
} 

@using (Html.BeginForm()) 
{ 
@Html.AntiForgeryToken() 

<div class="form-horizontal"> 
    <h4>OpticalcTestViewModel</h4> 
    <hr /> 
    @Html.ValidationSummary(true, "", new { @class = "text-danger" }) 
    <div class="form-group"> 
     @Html.LabelFor(model => model.OD_Sphere, htmlAttributes: new { @class = "control-label col-md-2" }) 
     <div class="col-md-10"> 
      @Html.EditorFor(model => model.OD_Sphere, new { htmlAttributes = new { @class = "form-control" } }) 
      @Html.ValidationMessageFor(model => model.OD_Sphere, "", new { @class = "text-danger" }) 
     </div> 
    </div> 

    <div class="form-group"> 
     @Html.LabelFor(model => model.OD_Cylinder, htmlAttributes: new { @class = "control-label col-md-2" }) 
     <div class="col-md-10"> 
      @Html.EditorFor(model => model.OD_Cylinder, new { htmlAttributes = new { @class = "form-control" } }) 
      @Html.ValidationMessageFor(model => model.OD_Cylinder, "", new { @class = "text-danger" }) 
     </div> 
    </div> 

    <div class="form-group"> 
     @Html.LabelFor(model => model.Axis, htmlAttributes: new { @class = "control-label col-md-2" }) 
     <div class="col-md-10"> 
      @Html.EditorFor(model => model.Axis, new { htmlAttributes = new { @class = "form-control" } }) 
      @Html.ValidationMessageFor(model => model.Axis, "", new { @class = "text-danger" }) 
     </div> 
    </div> 

    <div class="form-group"> 
     <div class="col-md-offset-2 col-md-10"> 
      <input type="submit" value="Create" class="btn btn-default" /> 
     </div> 
    </div> 
</div> 
    } 

    <div> 
    @Html.ActionLink("Back to List", "Index") 
    </div> 

    @section Scripts { 
    @Scripts.Render("~/bundles/jqueryval") 
     } 

これは私のコントローラである:

public class OpticalcTestController : Controller 
{ 
    // GET: OpticalcTest 
    public ActionResult Index() 
    { 

     return View(); 
    } 
}   

私は "editfor" ボックスから値を取得するか、それらに計算を実行する方法、それらの計算の結果を渡します(1つではなく、複数の結果)をビューのいくつかのラベルに戻しますか?

これは私が通常使用するwinformsのような簡単なことですが、私はこれに対する答えを見つけようとしています。私が検索から得た他の9,000の結果は、常に(全モデルとして)データをデータベースに書き込むことに関するものです。これにはデータベースはありません。それは、数値をとり、計算を行い、結果を吐き出すフォームです。

具体的には、これらの値をどのようにコントローラに追加し、円に球を追加し、次に円柱を軸に追加し、両方の結果を別々にラベル(またはそれらを表示する他の方法)に戻しますか?あなたが気付いたよう

[HttpPost] 
public ActionResult Index(OpticalcTestViewModel model) 
{ 
    //perform calculations 
    return View(model); 
} 

:あなたがする必要がある R

+0

JavaScriptで数学的計算を行うことは完全に実行可能であることに注意してください。計算を実行するために値をサーバーに戻す必要はありません。もちろん、それらをサーバーに置くための特定の理由(競合他社からの計算を隠すなど)がある場合を除きます。 – NightOwl888

+0

私はそれについて考えましたが、多くの計算が必要になり、デバッグやテストケースの作成が必要になります。 – rmnrdi

+0

サーバー上でこれを行う必要がある場合は、パフォーマンスを向上させるために、値をポストし、返された値でDOMを更新するためにajaxを使用することを検討する必要があります。 –

答えて

0

ビューからモデルを受け入れ、maccetturaが書いたようにEditorForヘルパー要素にバインドされたプロパティにアクセスするには、HttpPostメソッドが必要です。

次に、あなたはとてもメソッド内のような計算を行うことができます。

double sphereRadius = model.OD_Sphere/2; // demo calc 

計算結果は同じビューにあることを行っていますか?同じモデルですか? はいとすると、計算された値の新しいモデルプロパティを推奨し、それらをビューにバインドします。 Razorを使用して、必要に応じて入力値と計算値を表示/非表示にすることができます。

public class OpticalcTestViewModel 
{ 
    public double OD_Sphere { get; set; } 
    public double OD_Cylinder { get; set; } 
    public int Axis { get; set; } 

    public double sphereRadius { get; set; } // new calculated property 
} 

[HttpPost] 
public ActionResult Index(OpticalcTestViewModel model) 
{ 
    double sphereRadius = model.OD_Sphere/2; // demo calc 
    model.sphereRadius = sphereRadius; 
    return View(model); 
} 

注意をすでにビューにバインドされているモデルのプロパティを編集しようとした場合、それはその古い値を保持すること:あなたは新しいモデルのプロパティ/ワットを超える計算を使用すると仮定し

例。これは、値が実際にModelStateに保持され、デフォルトのモデルバインダーが最初にチェックし、存在する場合は値を使用するためです。これをオーバーライドするには、ModelStateプロパティをクリアする必要がありますが、少し面倒です。

+0

すばらしい説明!それは私が知る必要があったものです。最後に一つだけ。私はかなりの計算を実行する必要があります。コントローラーはそのための最良の場所ですか? ViewModelはそれにとってより良い場所になるでしょうか?または、モデルをすべての計算を実行してモデルを返す別のクラスに渡す必要がありますか? – rmnrdi

+1

厳密には優先事項です。私はコントローラーを軽く保つことです。そのため、計算やデータベース呼び出しのような静的なFactoryメソッドを作成します。 – akerra

+1

mvcには 'ViewState'というものはありません。あなたの参照は 'ModelState'です –

1

まず最初は、タイプOpticalcTestViewModelのパラメータを受け取り、[HttpPost]属性でタグ付けされたあなたのコントローラにアクションを追加している

おかげで、計算を実行した後で、新しい計算に追加する変数をmodelに変更してから、それをビュー(return View(model))に戻すだけです。

ビュー内のフォームは、デフォルトでPOSTを実行しています。 POST要求を処理できるアクションはないため、これらの呼び出しを処理することはできません。上記のコードはすべてを修正する必要があります。

どちらの場合でも、私はと高くなります。は、ASP.NET MVCに関するチュートリアルをいくつかお勧めします。マイクロソフトは2つのまともなチュートリアルを用意していますが、無料のオンラインリソースもたくさんあります。

+0

おかげでmaccettura。私は過去にチュートリアルを試してみましたが、いつも同じように終了するようです。私は、私の心の退屈、コードが壊れて、より多くの質問が答えます。私はそれらをやり続けますが、私はたくさんのことがたくさんあることは分かりませんでした。残念ながら、チュートリアルによる学習は、質問を考慮しないため、実際には最適ではありません。私たちはチュートリアルの話題です。助言がありますか?実際にあなたに "ああハ"の瞬間を与えたチュートリアルはありますか? – rmnrdi

関連する問題