¿Cómo edito un IEnumerable con ASP.NET MVC 3?
-
26-09-2019 - |
Pregunta
Teniendo en cuenta los siguientes 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; }
}
Quiero crear un formulario de edición para el tipo SomeModel
que contendría los campos de texto habituales para SomeProp1
y SomeProp2
y luego una tabla que contiene un campo de texto para cada SomeValue
en la colección SomeModel.MyData
.
¿Cómo se hace esto? ¿De qué manera los valores límite volver al modelo?
Actualmente tengo una forma que muestra un campo de texto para cada valor, pero todos tienen el mismo nombre y la misma identificación. Esto obviamente no es HTML válido y evitará MVC de cartografía por los valores de nuevo.
Solución
lo haría con el Editor de plantillas. De esta manera el marco se hará cargo de todo (de nombrar correctamente los campos de entrada a la unión adecuadamente los valores de nuevo en la acción posterior).
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);
}
}
Vista (~/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" />
<% } %>
Y, finalmente, el Editor de plantillas (~/Views/Home/EditorTemplates/SomeValue.ascx
) que se invoca automáticamente para cada elemento de la colección MyData
:
<%@ Control Language="C#" Inherits="System.Web.Mvc.ViewUserControl<MyApp.Models.SomeValue>" %>
<div>
<%= Html.TextBoxFor(x => x.Id) %>
<%= Html.TextBoxFor(x => x.Value) %>
</div>
Otros consejos
implementos IList
IEnumerable por lo que podría modificar su modelo de esta manera:
public class SomeModel {
public string SomeProp1 { get; set; }
public string SomeProp2 { get; set; }
public IList<SomeValue> MyData { get; set; }
}
Puede utilizar la interfaz IModelBinder
para crear una carpeta para su modelo específico. Hay un par de maneras de hacerlo. Se puede crear un cshtml EditorFor
para el modelo que bucle voluntad a través de su lista de SomeValue
y las identificaciones apropiadas de salida y lo que no. Luego, en su aplicación ModelBinder
su entonces habría leído a través de sus identificaciones y se unen de manera apropiada. Me pueden enviar una muestra de trabajo desde hace tiempo.