0

我想使用asp.net mvc實現一個產品。
我的產品分爲幾個模塊,我想使用jquery tab小部件來指導用戶通過提交。
我的ProductController將viewModel對象列表發送到產品視圖。
所以我的產品視圖看起來是這樣的:通過jquery更新viewModels ajax

@model IList<View.Products.Modules.IModuleView> 

<script type="text/javascript"> 
    $(document).ready(function() { 
     $("#tabs").tabs({ ajaxOptions: 
      { 
       type: 'POST', 
       cache: false 
      } 
     }); 
    }); 
</script> 

<div id="tabs"> 
    <ul> 
     <li><a href="#fragment-1"><span>Tab1</span></a></li> 
     <li><a href="#fragment-2"><span>Tab2</span></a></li> 
     <li>@Html.ActionLink("Result","Result","Product")</li> 
    </ul> 
    <div id="fragment-1"> 
     @{ 
      var viewModelA = Model.Where(c => c.GetType() == typeof(WebMvcUI.Models.ModelA)).First(); 
      var viewModelB = Model.Where(c => c.GetType() == typeof(WebMvcUI.Models.ModelB)).First(); 
      var viewModelC = Model.Where(c => c.GetType() == typeof(WebMvcUI.Models.ModelC)).First(); 
     } 
     @Html.Partial("viewA", viewModelA) 
     @Html.Partial("viewB", viewModelB) 
     @Html.Partial("viewC", viewModelC) 
    </div> 
    <div id="fragment-2"> 
     Lorem ipsum dolor... 
    </div> 
</div> 

到目前爲止,一切都很好。當用戶點擊最後一個選項卡時,他會在我的ProductController上調用操作Result。這裏是我的問題:什麼是收集我的部分視圖的所有形式信息,發送回控制器並更新我的viewModels的最佳方式?

感謝您的任何建議!

回答

0

這是我的當前的解決方案:
(我的模塊共用一個形式和演示對象被存儲在會話)

jQuery的:

$('#tabs').bind('tabsselect', function (event, ui) { 
     var formToSubmit = $('form:first'); 
     var jqxhr = $.post(formToSubmit.attr('action'), formToSubmit.serialize(), 
      function ShowResult(data) { 
       $("#fragment-2").html(data); 
      } 
     ); 
    }); 

所述控制器:

[HttpPost] 
    public ActionResult Result(FormCollection form) 
    { 
     viewModelA = (ViewModelA)Presenter.Modules.Where(c => c.GetType() == typeof(WebMvcUI.Models.ViewModelA)).First(); 
     viewModelB = (ViewModelB)Presenter.Modules.Where(c => c.GetType() == typeof(WebMvcUI.Models.ViewModelB)).First(); 

     TryUpdateModel<ViewModelA>(viewModelA, form); 
     TryUpdateModel<ViewModelB>(viewModelB, form); 

     TransactionResult result = Presenter.CheckBusinessRules(true); 

     if (result.IsDirty) 
     { 
      return Content(result.Message); 
     } 

     return PartialView(); 
    }