0

Я хотел бы реализовать продукт, используя asp.net mvc.
Мой продукт разделен на несколько модулей, и я хочу использовать виджет вкладки jquery, чтобы направлять пользователя через представление.
My ProductController отправляет список объектов viewModel в представление продукта.
Так мой взгляд продукт выглядит следующим образом:Обновить viewModels через jquery 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> 

До сих пор, так хорошо. Когда пользователь нажимает на последнюю вкладку, он вызывает действие Result на моем ProductController. И вот мой вопрос. Каков наилучший способ собрать всю информацию о форме моих частичных представлений, отправить ее обратно контроллеру и обновить мои модели просмотра?

Спасибо за любые предложения!

ответ

0

Это мое текущее решение:
(мои модули имеют одну форму и объект Presenter хранится в сессии)

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(); 
    } 
Смежные вопросы