Вы пишете 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>
ОК, да. вот и все! – Phil
Испытывали ли вы это из любопытства? по какой-то причине, в то время как я вернул правильные элементы в контроллер, они возвращаются в первоначальном порядке, не вспоминая мой новый «порядок». Это работает для вас вообще? – Phil
О чем * заказ * вы говорите? –