Hay un patrón para enlazar un IList de los elementos a la vista. Me parece que estoy teniendo problemas con el HttpPost. Sé que Phil Haack escribió un buen artículo, pero es fecha y me dijo que podría tener una solución con MVC 4.

  • Por favor, considere la posibilidad de agregar más detalle, incluyendo el código correspondiente y enlaces a tu pregunta, para hacerla más clara. He aquí una buena lista para empezar: tinyurl.com/so-list
  • El enlace de una lista a una vista. Lo que no está claro acerca de esto?
  • Hay variaciones dependiendo de lo que su forma se parece. Algunos consideran que el código de ayuda.
  • Las colecciones no son persistentes en la devolución de datos.
  • La selección de una lista de elementos, o un formulario que tiene un cuadro de texto para cada elemento, o un formulario que tiene un cuadro de texto para cada propiedad de cada elemento, todas las variaciones posibles en la «unión de una lista a una vista» y requieren diferentes técnicas.
  • Dijo que tiene problemas con el HttpPost. Al parecer, lo que significa que tienes algún código con un problema específico, para demostrarle a ella? Usted ha hecho referencia a algún artículo de Phil Haack, pero no hay enlace. No hay sólo una manera de «obligar a una lista de elementos a la vista». No nos confiemos de la generosidad de la comunidad que responde a tu pregunta.
  • Aquí está la url con Phil artículo. haacked.com/archive/2008/10/23/model-binding-to-a-list.aspx
  • Estoy tratando de mantenerlo lo más simple posible. No hay nada malo con mi código, es más de un MVC problema. El problema es el Modelo de Enlace de una Lista. Hay un sinfín de combinaciones, dicen que es una simple Lista de Coches.
  • refiérase a la respuesta aquí: stackoverflow.com/questions/7008714/…
  • No nos dicen que algo andaba mal con su código. Necesitamos ver su viewmodel+ver intento de saber lo de la lista de unión de la técnica de trabajo para su escenario.

InformationsquelleAutor Karthik | 2013-03-13

3 Comentarios

  1. 53

    Esta es la forma en que yo lo hago si necesito un formulario que se muestra para cada elemento, y las entradas de varias propiedades. Realmente depende de lo que yo estoy tratando de hacer aunque.

    ViewModel se parece a esto:

    public class MyViewModel
    {
       public List<Person> Persons{get;set;}
    }

    Punto de vista(con BeginForm de curso):

    @model MyViewModel
    
    
    @for( int i = 0; i < Model.Persons.Count(); ++i)
    {
        @Html.HiddenFor(m => m.Persons[i].PersonId)
        @Html.EditorFor(m => m.Persons[i].FirstName) 
        @Html.EditorFor(m => m.Persons[i].LastName)         
    }

    Acción:

    [HttpPost]public ViewResult(MyViewModel vm)
    {
    ...

    Tenga en cuenta que en el post de nuevo, sólo las propiedades que había entradas disponibles se tienen valores. I. e., si la Persona tenía una .El SSN de la propiedad, que no estaría disponible en el post de la acción, porque no era un campo en el formulario.

    Tenga en cuenta que la forma en MVC modelo de enlace funciona, solo buscará consecutivos ID. Para hacer algo como esto donde condicionalmente ocultar un elemento hará que no se unen los datos después de que el 5º elemento, ya que una vez que encuentre un hueco en el IDs, se detendrá la unión. Incluso si había 10 personas, sólo se obtendrá de los 4 primeros en la devolución de datos:

    @for( int i = 0; i < Model.Persons.Count(); ++i)
    {
        if(i != 4)//conditionally hide 5th item, 
        { //but BUG occurs on postback, all items after 5th will not be bound to the the list
          @Html.HiddenFor(m => m.Persons[i].PersonId)
          @Html.EditorFor(m => m.Persons[i].FirstName) 
          @Html.EditorFor(m => m.Persons[i].LastName)           
        }
    }
    • Yo uso mvc 5.1 y en lugar de ++1 tuve que hacerlo así: @{ ++i; }, dentro de un @foreach() bloque.
    • Tal vez, podría haber sido también si tenía las etiquetas de HTML, usted tendría la @{ } para cambiar ese contexto posterior a código C#. Pero una buena sugerencia de cualquier manera.
    • Declarando «yo» y, a continuación, utilizando un foreach es muy feo, sobre todo cuando tenemos PARA los BUCLES. También, por favor no utilice una Lista específica de aplicación a menos que usted realmente necesita.
    • Buen punto, a veces no los puedo usar EditorFor y debe construir el <input> y como la facilidad de tener la variable de iteración todavía como se siente no muy SECO para que se repita el índice de acceso en todo el lugar. En este ejemplo no hay ningún uso para el person variables, por lo que me cambié de foreach para para.
  2. 9

    Una solución limpia podría ser crear una clase genérica para manejar la lista, por lo que no es necesario crear una clase diferente cada vez que lo necesite.

    public class ListModel<T>
    {
        public List<T> Items { get; set; }
    
        public ListModel(List<T> list) {
            Items = list;
        }
    }

    y al volver la Vista sólo necesita simplemente hacer:

    List<customClass> ListOfCustomClass = new List<customClass>();
    //Do as needed...
    return View(new ListModel<customClass>(ListOfCustomClass));

    a continuación, definir la lista en el modelo:

    @model ListModel<customClass>

    y listo para ir:

    @foreach(var element in Model.Items) {
      //do as needed...
    }
  3. 4

    ~Controlador de

    namespace ListBindingTest.Controllers
    {
        public class HomeController : Controller
        {
            //
            //GET: /Home/
    
            public ActionResult Index()
            {
                List<String> tmp = new List<String>();
                tmp.Add("one");
                tmp.Add("two");
                tmp.Add("Three");
                return View(tmp);
            }
    
            [HttpPost]
            public ActionResult Send(IList<String> input)
            {
                return View(input);
            }    
        }
    }

    ~ Inflexible De Vista De Índice

    @model IList<String>
    
    @{
        Layout = null;
    }
    
    <!DOCTYPE html>
    
    <html>
    <head>
    <meta name="viewport" content="width=device-width" />
    <title>Index</title>
    </head>
    <body>
        <div>
        @using(Html.BeginForm("Send", "Home", "POST"))
        {
            @Html.EditorFor(x => x)
            <br />
            <input type="submit" value="Send" />
        }
        </div>
    </body>
    </html>

    ~ Inflexible Enviar Vista

    @model IList<String>
    
    @{
        Layout = null;
    }
    
    <!DOCTYPE html>
    
    <html>
    <head>
    <meta name="viewport" content="width=device-width" />
    <title>Send</title>
    </head>
    <body>
        <div>
        @foreach(var element in @Model)
        {
            @element
            <br />
        }
        </div>
    </body>
    </html>

    Esto es todo lo que tenía que hacer el hombre, cambiar su MyViewModel modelo a IList.

    • Steve, gracias por la info, esto funciona bien. Mi problema, tal vez no me explique fue el Enlace de una Lista dinámica. Sanderson uñas en este post blog.stevensanderson.com/2010/01/28/…
    • No importa si me estáticamente escriba la lista en el controlador, o agarrar a partir de una base de datos o un archivo. Donde la lista es irrelevante para el modelo de enlace.
    • Mi problema fue con HttpPost. Cuando una lista de objetos, cambios en la visión, los valores no se publican correctamente. Esto es lo que Sanderson dirigida y estoy usando su método. El MVC equipo sabe acerca de esto y Sanderson método es el mejor que he visto. Pido disculpas a todos por no ser claro.

Dejar respuesta

Please enter your comment!
Please enter your name here