Pergunta

Dados os seguintes tipos

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; }
}

Eu quero criar um formulário de edição para o tipo SomeModel que conteriam os campos de texto usuais para SomeProp1 e SomeProp2 e então uma tabela que contém um campo de texto para cada SomeValue no SomeModel.MyData coleção.

Como isso é feito? Como os valores voltam ao modelo?

Atualmente, tenho um formulário exibindo um campo de texto para cada valor, mas todos eles têm o mesmo nome e o mesmo ID. Obviamente, isso não é válido HTML e impedirá que o MVC mapeie os valores de volta.

Foi útil?

Solução

Você faria isso usando modelos de editor. Dessa forma, a estrutura cuidará de tudo (desde nomear adequadamente os campos de entrada até vincular adequadamente os valores de volta na ação pós).

Controlador:

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);
    }
}

Visão (~/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" />
<% } %>

E finalmente o modelo do editor (~/Views/Home/EditorTemplates/SomeValue.ascx) que serão invocados automaticamente para cada elemento do MyData coleção:

<%@ Control Language="C#" Inherits="System.Web.Mvc.ViewUserControl<MyApp.Models.SomeValue>" %>
<div>
    <%= Html.TextBoxFor(x => x.Id) %>
    <%= Html.TextBoxFor(x => x.Value) %>
</div>

Outras dicas

IList implementa IEnumerable para que você possa modificar seu modelo como assim:

public class SomeModel {
    public string SomeProp1 { get; set; }
    public string SomeProp2 { get; set; }
    public IList<SomeValue> MyData { get; set; }
}

Você pode usar o IModelBinder Interface para criar um fichário para o seu modelo específico. Existem algumas maneiras de fazer isso. Você pode criar um EditorFor cshtml para o modelo que percorre o seu SomeValue Liste e saia IDs apropriados e o que não. Então, em seu ModelBinder Implementação que você leria por seus IDs e os vincularia adequadamente. Eu posso postar uma amostra de trabalho em um tempo.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top