2012-06-10 2 views
1

с использованием сортировки JQuery и попытки отправить новый заказ обратно на мой контроллер, но не имея большой удачи. Моя точка зрения:Отправка нового заказа обратно на контроллер MVC

using (Ajax.BeginForm("EditTickerOrder", new AjaxOptions { InsertionMode = InsertionMode.Replace, HttpMethod = "POST", })) 
{ 
    <div id="editableticker"> 
     @Html.HiddenFor(m => m.ProjectGUID) 
     <ul id="sortablediv"> 
      @foreach (DGI.CoBRA.Tools.BussinessObjects.CollabLibrary.TickerObjects.Ticker t in Model) 
      { 
       <li class="ui-state-default" id="@t.pKeyGuid.ToString()"> 
        <p>@Html.CheckBox(t.pKeyGuid.ToString(), t.Display, new { @class = "activechk" }) 
         <span style="font-weight: bold"> 
          @t.Text 
         </span> 
        </p> 
       </li> 
      } 
     </ul> 
    <input type="submit" value="Save New Ticker Order" /> 
} 

и мой контроллер:

[HttpPost] 
public ActionResult EditTickerOrder(Guid ProjectGUID, List<string> items) 
{ 
    TickerCollectionModel TickerData = new TickerCollectionModel(); 
    TickerData.ProjectGUID = ProjectGUID; 
    TickerData.ListAllBySession(ProjectGUID); 
    return PartialView("TickerList", TickerData); 
} 

однако list<string> items всегда null. Есть идеи?

ответ

2

Вы пишете foreach петли, наиболее определенно нарушающие naming conventions для полей ввода формы, которые связывает связующее устройство по умолчанию для работы с коллекциями. Если вы не уважаете установленный формат проводов, вы не можете ожидать, что связующее устройство по умолчанию сможет повторно поддерживать ваши модели в действии POST.

На самом деле, почему бы вам не использовать модели просмотра и шаблоны редакторов? Они делают все тривиальным в ASP.NET MVC.

Итак, давайте определим модель представления, которая будет отражать ваши требования просматривать (или, по крайней мере, показанные в вашем вопросе => Вы, конечно, можете обогатить его дополнительными свойства, которые вы хотите обработать):

public class TickerViewModel 
{ 
    public Guid Id { get; set; } 
    public bool IsDisplay { get; set; } 
    public string Text { get; set; } 
} 

public class ProjectViewModel 
{ 
    public Guid ProjectGUID { get; set; } 
    public IEnumerable<TickerViewModel> Tickers { get; set; } 
} 

а затем контроллер, которому поручено запросить ваш уровень DAL, получить модель домена, отобразить модель домена в модель представления, которую мы определили для этого представления, и передать модель представления в представление. Наоборот, действие POST получает модель представления с точки зрения, отображает модель представления обратно в некоторой области модели, проходит модель предметной области на ваш DAL слоя для обработки и оказывает некоторое представление или перенаправляет на действие успеха:

public class HomeController : Controller 
{ 
    public ActionResult Index() 
    { 
     // TODO: those values come from a data layer of course 
     var model = new ProjectViewModel 
     { 
      ProjectGUID = Guid.NewGuid(), 
      Tickers = new[] 
      { 
       new TickerViewModel { Id = Guid.NewGuid(), Text = "ticker 1" }, 
       new TickerViewModel { Id = Guid.NewGuid(), Text = "ticker 2" }, 
       new TickerViewModel { Id = Guid.NewGuid(), Text = "ticker 3" }, 
      } 
     }; 
     return View(model); 
    } 

    [HttpPost] 
    public ActionResult Index(ProjectViewModel model) 
    { 
     // Everything will be correctly bound here => map the view model 
     // back into your domain model and pass the domain model to 
     // your DAL layer for processing ... 

     return Content("Thanks for submitting"); 
    } 
} 

вид (стоит отметить, что в этом примере я использовал стандартную форму вместо AJAX, но это тривиально, чтобы преобразовать его в форму AJAX):

@model ProjectViewModel 

@using (Html.BeginForm()) 
{ 
    @Html.HiddenFor(m => m.ProjectGUID) 
    <div id="editableticker"> 
     <ul id="sortablediv"> 
      @Html.EditorFor(x => x.Tickers) 
     </ul> 
    </div> 
    <button type="submit">OK</button> 
} 

и, наконец, соответствующий шаблон редактора, который автоматически будет для каждого элемента коллекции Тикеров (~/Views/Home/EditorTemplates/TickerViewModel.cshtml):

@model TickerViewModel 

<li class="ui-state-default"> 
    <p> 
     @Html.CheckBoxFor(x => x.IsDisplay, new { @class = "activechk" }) 
     @Html.LabelFor(x => x.IsDisplay, Model.Text) 
     @Html.HiddenFor(x => x.Text) 
     @Html.HiddenFor(x => x.Id) 
    </p> 
</li> 
+0

ОК, да. вот и все! – Phil

+0

Испытывали ли вы это из любопытства? по какой-то причине, в то время как я вернул правильные элементы в контроллер, они возвращаются в первоначальном порядке, не вспоминая мой новый «порядок». Это работает для вас вообще? – Phil

+0

О чем * заказ * вы говорите? –

Смежные вопросы