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.

¿Fue útil?

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.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top