Como faço para editar um Ienumerable com asp.net MVC 3?
-
26-09-2019 - |
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.
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.