Вопрос

Учитывая следующие типы

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 Реализация Вы затем прочитали ваши идентификаторы и соответствующим образом связывают их. Я могу опубликовать рабочий образец некоторое время.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top