2016-09-22 5 views
3

私は小さなサンプルに大きな問題を最小限に抑えようとしたので、新しいサンプルWebプロジェクトを作成しました。 VSのmvc-empty私は家のコントローラで "インデックス"という名前のビューを作成しました。 Indexビューコード:asp.net mvcでAjax.BeginFormを送信した後、jQueryコードが正常に動作しない

@model WebApplication16.ViewModels.Home.IndexVM 
@{ 
    ViewBag.Title = "Index"; 
} 

@Html.Partial("~/Views/Home/_Orders.cshtml", Model.Orders) 

@section scripts{ 
    <script src="~/Scripts/jquery.validate.js"></script> 
    <script src="~/Scripts/jquery.validate.unobtrusive.js"></script> 
    <script src="~/Scripts/jquery.unobtrusive-ajax.js"></script> 
    <script> 
     $("#Type").change(function() { 



      $('#order-current > img').remove(); 
      var currentOrder = "#Type_" + $("#Type").find('option:selected').text(); 

      var $img = $(currentOrder).clone(); 
      $img.removeClass("hidden"); 
      $("#order-current").append($img); 

      $("#ajax-form").submit(); 
     }); 
    </script> 
} 

ホームコントローラコード:

public class HomeController : Controller 
    { 
     [HttpGet] 
     public ActionResult Index() 
     { 
      IndexVM dataVM = new IndexVM(); 
      GetControlsDataSource(dataVM.Orders); 

      return View(dataVM); 
     } 

     private static void GetControlsDataSource(OrdersVM dataVM) 
     { 
      List<SelectListItem> typeControlDataSource = new List<SelectListItem>(); 
      foreach (var en in Enum.GetValues(typeof(TypeEnum))) 
      { 
       SelectListItem item = new SelectListItem(); 
       item.Text = en.ToString(); 
       item.Value = ((int)en).ToString(); 
       typeControlDataSource.Add(item); 
      } 
      dataVM.TypeControlDataSource = typeControlDataSource; 
     } 


     [HttpPost] 
     public ActionResult Pay(IndexVM dataVM) 
     { 
      GetControlsDataSource(dataVM.Orders); 
      if (ModelState.IsValid) 
      { 
       dataVM.Orders.Info = "Info bla bla bla"; 
       return PartialView("~/Views/Home/_Orders.cshtml", dataVM.Orders); 
      } 
      else 
      { 
       return View(dataVM); 
      } 

     } 
    } 

_Orders部分図のインデックスview.Theコードの上にレンダリングされる「_Orders」という名前の部分図は、もあります。

@model WebApplication16.ViewModels.Home.OrdersVM 

@using (Ajax.BeginForm("Pay", "Home", new AjaxOptions 
{ 
    InsertionMode = InsertionMode.Replace, 
    UpdateTargetId = "result", 
}, new { id = "ajax-form" })) 
{ 
    <div id="result"> 
     <div id="order-current"> 

     </div> 


     <div> 
      @Html.TextBoxFor(x => x.Name, new { @class = "form-control", style = "margin-top:10px;", id = "Name" }) 
      @Html.ValidationMessageFor(x => x.Name) 
     </div> 

     <div> 
      @Html.DropDownListFor(x => x.Type, Model.TypeControlDataSource, new { @class = "form-control", style = "margin-top:10px;", id = "Type", }) 
      @Html.ValidationMessageFor(x => x.Type) 
     </div> 
     <div> 
      <p>@Model.Info</p> 
     </div> 
     <button type="submit" class="btn btn-primary" name="ok"> OK</button> 
    </div> 


} 

<div id="orders-container"> 
    <img id="Type_I" src="~/App_Images/Type_I.png" class="img-responsive hidden" /> 
    <img id="Type_II" src="~/App_Images/Type_II.png" class="img-responsive hidden" /> 
    <img id="Type_III" src="~/App_Images/Type_III.png" class="img-responsive hidden"/> 
</div> 
Index model is described by class IndexVM: 
public class IndexVM 
    { 
     public IndexVM() 
     { 
      this.Orders = new OrdersVM(); 
     } 

     public OrdersVM Orders { get; set; } 
    } 

_Ordersモデルは、クラスOrdersVMによって記述される:

public class OrdersVM 
    { 

     [Required] 
     public string Name { get; set; } 

     public string Info { get; set; } 

     [Required] 
     public TypeEnum Type { get; set; } 

     public List<SelectListItem> TypeControlDataSource { get; set; } 
    } 


public enum TypeEnum 
{ 
    I, 
    II, 
    III 
} 

id = "Type"のDropDownListForコントロールの値を変更した後、id = "order-current"のコンテナにインデックスビューのjqueryコードで隠しフィールドの画像を挿入し、その操作の後にajax形式提出する必要があります。これは、適切けどにHomeControllerから

return PartialView("~/Views/Home/_Orders.cshtml", dataVM.Orders); 

を呼び出した後に動作しますが、フィールドの情報が正しく更新されますが、「注文電流」のdivコンテナから注入された画像がなくなっています。私はF12ボタンを使用してGoogle Chromeの何が間違っているかを調べようとしましたが、エラーはありませんが、 "browserLink"スクリプトに無限ループが発生しました。理由を説明できません。 私が望むのは、ajax形式を送信した後、id = "order-current"のコンテナ内に注射した画像を見ることだけです。どのようにこれを行うには、私は間違っていた?

答えて

0

私の友人のおかげで、私はついにこの問題を解決しました。 "結果"コンテナを更新した後、このコンテナにあるコントロールにjQueryによって追加されたすべてのイベントは固定解除されます。それがクラッシュする理由です。 正常に動作させるには、関数を作成し、それをAjaxBeginFormのOnCompleteイベントに固定します。 ajaxを介して結果コンテナを更新するたびに、この関数が呼び出されます。私は間違ったビューモデルクラスを挿入したので、ホームコントローラで小さな間違いをしました。すべての変更の後、これは次のようになります。 ホームコントローラコード:

public class HomeController : Controller 
    { 
     [HttpGet] 
     public ActionResult Index() 
     { 
      IndexVM dataVM = new IndexVM(); 
      GetControlsDataSource(dataVM.Orders); 

      return View(dataVM); 
     } 

     private static void GetControlsDataSource(OrdersVM dataVM) 
     { 
      List<SelectListItem> typeControlDataSource = new List<SelectListItem>(); 
      foreach (var en in Enum.GetValues(typeof(TypeEnum))) 
      { 
       SelectListItem item = new SelectListItem(); 
       item.Text = en.ToString(); 
       item.Value = ((int)en).ToString(); 
       typeControlDataSource.Add(item); 
      } 
      dataVM.TypeControlDataSource = typeControlDataSource; 
     } 


     [HttpPost] 
     public ActionResult Pay(OrdersVM dataVM) 
     { 
      GetControlsDataSource(dataVM); 
      if (ModelState.IsValid) 
      { 
       dataVM.Info = "Info bla bla bla"; 
       return PartialView("~/Views/Home/_Orders.cshtml", dataVM); 
      } 
      else 
      { 
       return View(dataVM); 
      } 

     } 
    } 

Indexビュー:

@model WebApplication16.ViewModels.Home.IndexVM 
@{ 
    ViewBag.Title = "Index"; 
} 

@Html.Partial("~/Views/Home/_Orders.cshtml", Model.Orders) 

<div id="orders-container"> 
    <img id="Type_I" src="~/App_Images/Type_I.png" class="img-responsive hidden" /> 
    <img id="Type_II" src="~/App_Images/Type_II.png" class="img-responsive hidden" /> 
    <img id="Type_III" src="~/App_Images/Type_III.png" class="img-responsive hidden" /> 
</div> 

@section scripts{ 
    <script src="~/Scripts/jquery.validate.js"></script> 
    <script src="~/Scripts/jquery.validate.unobtrusive.js"></script> 
    <script src="~/Scripts/jquery.unobtrusive-ajax.js"></script> 
    <script> 

     function imageOnChangeEvent() { 
      $("#ajax-form").submit(); 
     } 

     function OnCompleteAjaxForm() { 

      $('#order-current > img').remove(); 
      var currentOrder = "#Type_" + $("#Type").find('option:selected').text(); 

      var $img = $(currentOrder).clone(); 
      $img.removeClass("hidden"); 
      $("#order-current").append($img); 
     } 

    </script> 

} 

_Orders部分図コード:

@model WebApplication16.ViewModels.Home.OrdersVM 

    <div id="result"> 
     @using (Ajax.BeginForm("Pay", "Home", new AjaxOptions 
     { 
      InsertionMode = InsertionMode.Replace, 
      UpdateTargetId = "result", 
      OnComplete = "OnCompleteAjaxForm()" 
     }, new { id = "ajax-form" })) 
     { 

      <div id="order-current"> 

      </div> 


      <div> 
       @Html.TextBoxFor(x => x.Name, new { @class = "form-control", style = "margin-top:10px;", id = "Name" }) 
       @Html.ValidationMessageFor(x => x.Name) 
      </div> 

      <div> 
       @Html.DropDownListFor(x => x.Type, Model.TypeControlDataSource, new { @class = "form-control", style = "margin-top:10px;", id = "Type", onchange = "imageOnChangeEvent()" }) 
       @Html.ValidationMessageFor(x => x.Type) 
      </div> 
      <div> 
       <p>@Model.Info</p> 
      </div> 
      <button type="submit" class="btn btn-primary" id="button_ok" name="ok"> OK</button> 


     } 
    </div> 
関連する問題