Как отредактировать IEnumerableT с ASP.NET MVC 3?

17

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

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 отображать значения обратно.

    
задан Greg B 20.11.2010 в 17:50
источник

2 ответа

14

Вы сделали бы это, используя Шаблоны Редактора. Таким образом, структура будет заботиться обо всем (от правильного назначения полей ввода для правильной привязки значений в post post).

Контроллер:

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>
    
ответ дан Darin Dimitrov 20.11.2010 в 20:59
  • Хех, я думаю, я не буду публиковать его сейчас, потому что ответ уже лучше :) Я не знал, что вы могли бы связывать списки, которые легко, хотя. благодаря –  Buildstarted 20.11.2010 в 21:27
  • для MVC3 не лучше ли использовать Razor? –  arame3333 18.08.2011 в 18:05
1

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

    
ответ дан Buildstarted 20.11.2010 в 18:51
  • Когда форма будет отправлена, будет ли ViewEngine заботиться о привязке данных к правильным элементам в коллекции? –  Greg B 20.11.2010 в 18:55
  • Вы знаете, что действительно странно ... Я мог бы поклясться, что этот вопрос задал что-то другое ... Я думаю, что я одновременно читал два вопроса и отвечал на неправильное ... Я собираюсь изменить свой ответ –  Buildstarted 20.11.2010 в 20:39