Как мне отредактировать IEnumerable с ASP.NET MVC 3?
-
26-09-2019 - |
Вопрос
Учитывая следующие типы
public class SomeValue
{
public int Id { get; set; }
public int Value { get; set; }
}
public class SomeModel
{
public string SomeProp1 { get; set; }
public string SomeProp2 { get; set; }
public IEnumerable<SomeValue> MyData { get; set; }
}
Я хочу создать форму редактирования для типа SomeModel
который будет содержать обычные текстовые поля для SomeProp1
и SomeProp2
а затем таблица, содержащая текстовое поле для каждого SomeValue
в SomeModel.MyData
коллекция.
Как это сделано? Как ценности связаны обратно к модели?
В настоящее время у меня есть форма, отображающая текстовое поле для каждого значения, но все они имеют одно и то же имя и тот же идентификатор. Это, очевидно, не допустимо HTML и предотвратит MVC от сопоставления значений обратно.
Решение
Вы сделаете это, используя шаблоны редактора. Таким образом, структура позаботится обо всем (от правильной зоны входных полей, чтобы правильно привязать значения обратно в действие пост).
Контроллер:
public class HomeController : Controller
{
public ActionResult Index()
{
// In the GET action populate your model somehow
// and render the form so that the user can edit it
var model = new SomeModel
{
SomeProp1 = "prop1",
SomeProp2 = "prop1",
MyData = new[]
{
new SomeValue { Id = 1, Value = 123 },
new SomeValue { Id = 2, Value = 456 },
}
};
return View(model);
}
[HttpPost]
public ActionResult Index(SomeModel model)
{
// Here the model will be properly bound
// with the values that the user modified
// in the form so you could perform some action
return View(model);
}
}
Вид (~/Views/Home/Index.aspx
):
<% using (Html.BeginForm()) { %>
Prop1: <%= Html.TextBoxFor(x => x.SomeProp1) %><br/>
Prop2: <%= Html.TextBoxFor(x => x.SomeProp2) %><br/>
<%= Html.EditorFor(x => x.MyData) %><br/>
<input type="submit" value="OK" />
<% } %>
И, наконец, шаблон редактора (~/Views/Home/EditorTemplates/SomeValue.ascx
) который будет автоматически вызван для каждого элемента MyData
коллекция:
<%@ Control Language="C#" Inherits="System.Web.Mvc.ViewUserControl<MyApp.Models.SomeValue>" %>
<div>
<%= Html.TextBoxFor(x => x.Id) %>
<%= Html.TextBoxFor(x => x.Value) %>
</div>
Другие советы
IList
реализует iEnumerable, чтобы вы могли изменять вашу модель так:
public class SomeModel {
public string SomeProp1 { get; set; }
public string SomeProp2 { get; set; }
public IList<SomeValue> MyData { get; set; }
}
Вы можете использовать IModelBinder
Интерфейс для создания связующего для вашей конкретной модели. Есть пара способов сделать это. Вы можете создать EditorFor
CSHTML для модели, которая будет петлей через ваш SomeValue
Список и выведите соответствующие идентификаторы и что нет. Тогда в вашем ModelBinder
Реализация Вы затем прочитали ваши идентификаторы и соответствующим образом связывают их. Я могу опубликовать рабочий образец некоторое время.