2016-09-28 9 views
0

だから私は、ユーザーが2つのボタンのうちの1つをクリックすると、特定のテキストボックスだけを使用する必要があります。現時点でSafeForLaterのチェックは常に偽であり、この方法では機能しません。ですから、あるボタンがヒットしてデータを私のモデルにバインドしたときに、特定のテキストボックスを使用する方法を知っていれば、感謝しています。見るからビューでは、特定のボタンクリックで特定のテキストボックスとモデルを使用する必要があります。

@model ProblemExample.Models.ViewModelOrder 

@{ 
    ViewBag.Title = "Create Order"; 
} 

<h2>CreateOrder</h2> 

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

    <div class="form-horizontal"> 
     @Html.ValidationSummary(true, "", new { @class = "text-danger" }) 

     @if (TempData["CallFrom"] != null && Convert.ToString(TempData["CallFrom"]) == "SenditNow") 
     { 
      @Html.TextBoxFor(m => m.viewModelSenditNow.NameOfCustomer) 
      @Html.TextBoxFor(m => m.viewModelSenditNow.Address) 
     } 

     else 
     { 
      @Html.TextBoxFor(m => m.viewModelSafeForLater.NameOfCustomer) 
      @Html.TextBoxFor(m => m.viewModelSafeForLater.Address) 
     } 
     <hr /> 
     <button class="formular-button-submit" type="submit" name="SenditNow" value="SenditNow">Send it now!</button> 
     <button class="formular-button-submit" type="submit" name="submit" id="SafeForLater" value="SafeForLater">Save it for later!</button> 
</div> 
} 

のViewModel:

public class ViewModelOrder 
    { 
     public ViewModelSendItNow viewModelSenditNow { get; set; } 
     public ViewModelSafeForLater viewModelSafeForLater { get; set; } 
    } 

のViewModel SendItnow:

public class ViewModelSendItNow 
    { 
     [Required] 
     public string NameOfCustomer { get; set; } 
     [Required] 
     public string Address { get; set; } 
    } 

のViewModel SaveForLater:

public class ViewModelSafeForLater 
    { 
     public string NameOfCustomer { get; set; } 
     public string Address { get; set; } 
    } 

コントローラ:

public ActionResult CreateOrder() 
     { 
      ViewModelOrder viewModel = new ViewModelOrder(); 
      return View(viewModel); 
     } 

     [HttpPost] 
     public ActionResult CreateOrder(ViewModelOrder viewModel, string submit) 
     { 
      TempData["CallFrom"] = submit; 

      if(submit == "SendItNow") 
      { 
       Order myOrder = new Order() 
       { 
        NameOfCustomer = viewModel.viewModelSenditNow.NameOfCustomer, 
        Address = viewModel.viewModelSenditNow.Address, 
        State = 1 
       }; 
       db.Orders.Add(myOrder); 
       db.SaveChanges(); 
      } 

      else 
      { 
       Order myOrder = new Order() 
       { 
        NameOfCustomer = viewModel.viewModelSafeForLater.NameOfCustomer, 
        Address = viewModel.viewModelSafeForLater.Address, 
        State = 999 
       }; 
       db.Orders.Add(myOrder); 
       db.SaveChanges(); 
      } 
      return View(viewModel); 
     } 
+0

モデルは別にする必要がありますか?あなたのビューモデルはただ1つの名前と住所を持つことができませんし、コントローラはそれらと何をすべきかを決定しますか?それを行うと、Sandipのように押すことができるボタンを区別するだけで済みます。それ以外の場合は2つのフォームを作成して2つの異なるアクションに直接投稿することができます。 – Lukos

+0

ご意見ありがとうございます。私はあなたになぜ2つのモデルを使っているのか説明しようとします。その理由は、ViewModelの[Requirement] -Attributeを使用してクライアント側の検証を使用するためです。ユーザーが今すぐ注文を送信することを決定した場合、データは完全に検証されます。私は理由が今ではっきりしていることを願っていますが、あなたが新しいアイデアを持っていれば、これはどうすれば解決できるのでしょうか?私はまだASP.NET MVCでたくさんのことを学んでいるので、とても興味があります。 – RawMVC

答えて

0

あなたは、コントローラからをクリックして、そのTempDataを値の代わりのRequest.Form値をチェックしボタンをTempDataをに値を設定することができます。

コントローラー:

public ActionResult Save(string submit) 
{ 
    TempData["CallFrom"] = submit; 
    return RedirectToAction("Index"); 
} 

ビュー:

@using (Html.BeginForm("Save","Home")) 
{ 
    <div class="form-horizontal"> 

     @if (TempData["CallFrom"] != null && Convert.ToString(TempData["CallFrom"]) == "SenditNow") 
     { 
      <h1>SenditNow</h1> 
      <input type="text" value="NameOfCustomer" /> 
      <input type="text" value="Address" /> 
     } 

     else 
     { 
      <h1>SafeForLater</h1> 
      <input type="text" value="NameOfCustomer" /> 
      <input type="text" value="Address" /> 
     } 
     <hr /> 
     <button class="formular-button-submit" type="submit" name="submit" id="SenditNow" value="SenditNow">Send it now!</button> 
     <button class="formular-button-submit" type="submit" name="submit" id="SafeForLater" value="SafeForLater">Safe it for later!</button> 
    </div> 
} 

注:お使いのコントローラでは提出の値を取得します。クリックしたボタンだけがその値を渡します

+0

あなたの答えをありがとう、小さなスニペットあなたはそれをどのようにしますか? – RawMVC

+0

これを説明し、このコードスニペットを作成してくれてありがとう、私の問題を完全に解決し、あなたの助けに非常に感謝しています! :) – RawMVC

+0

もう一度、私は最後の問題が1つあります。どのボタンがヒットしたのかをコントローラでチェックインするにはどうすればいいですか?私は次のステートメントでそれを試してみました:if(TempData ["CallFrom"]!= null && Convert.ToString(TempData ["CallFrom"])== "SenditNow")しかし、うまくいきませんでした。あなたは私のためのヒントを持っていますか? – RawMVC

関連する問題