2012-01-24 17 views
7

Soy bastante nuevo en MVC y realmente estoy tratando de acostumbrarme a la vinculación del modelo. Tengo un modelo simple que he creado en una forma. Sin embargo, cuando publico ese formulario SÓLO los valores de la caja de texto se transfieren al controlador. Necesito el campo de descripción también que se hace usando DisplayTextFor. ¿Es esto algo que tendré que hacer para crear una carpeta de modelos personalizada? Podría tomar un atajo y simplemente convertir la descripción en un cuadro de texto de solo lectura sin bordes para que parezca texto, pero quiero hacerlo de la manera correcta. Aquí está mi código:MVC3 No se está publicando el modelo completo

public class FullOrder 
{ 
    public List<FullOrderItem> OrderList { get; set; } 
    public string account { get; set; } 
    public string orderno { get; set; } 
} 

public class FullOrderItem 
{ 
    public int? ID { get; set; } 
    public int? OrderId { get; set; } 
    public string Description { get; set; } 
    public int Qty { get; set; } 
    public decimal? Price { get; set; } 
} 

aquí es la vista

<table class="ExceptionAltRow"> 
    <tr style="background-color: #DDD;"> 
     <td class="strong" style="width:500px;"> 
      Description 
     </td> 
     <td class="strong" style="width:100px;"> 
      Qty 
     </td> 
     <td class="strong" style="width:100px;"> 
      Previous Purchases 
     </td> 
    </tr> 
    @for (int i = 0; i < Model.FullOrder.OrderList.Count(); i++) 
    { 
     <tr> 
      <td> 
       @Html.DisplayTextFor(m => m.FullOrder.OrderList[i].Description) 
      </td> 
      <td> 
       @Html.TextBoxFor(m => m.FullOrder.OrderList[i].Qty, new { @style = "width:50px;" }) 
      </td> 
     </tr> 
    } 
    </table> 

aquí es el controlador:

[HttpPost] 
public ActionResult AddItem(FullOrder f) 
{ 
    //doesn't work description is not passed but qty is 
} 

¿Hay una manera que puedo conseguir mi modelo a simplemente transmitir la descripción en una publicación, aunque no es una caja de texto para elementos encuadernados de mi modelo?

Respuesta

2

Los únicos datos que se publicarán en su aplicación son los datos que están disponibles en el formulario que se envía (a menos que los campos del formulario estén deshabilitados, por supuesto). Puede anular lo que ve el controlador implementando un custom model binder.

En este caso, el formulario se compone de muchas instancias de un solo campo de texto:

@Html.TextBoxFor(m => m.FullOrder.OrderList[i].Qty, new { @style = "width:50px;" }) 

Si desea descripción y otras cosas rellenado, tienen que estar presentes en el formulario. Si ellos no tienen que ser visibles, entonces se puede usar el ayudante HiddenFor:

@Html.HiddenFor(m => m.FullOrder.OrderList[i].Description) 

Ver también What does Html.HiddenFor do?

+0

gracias por la ayuda, exactamente lo que necesitaba saber. – mscard02

+0

Si una respuesta es útil, debe hacer clic en la flecha hacia arriba para indicarlo. –

0

La función DisplayTextFor sólo se va a salida de ese texto al DOM del navegador. La vinculación del framework MVC básicamente mira las variables POST/GET, y automáticamente establece esos valores para su modelo.

Si desea unir automáticamente cualquier dato (como el texto de su descripción), deberá almacenarlo en algún tipo de entrada y/o campo oculto. Los campos ocultos funcionan, pero son ineficientes, ya que está colocando un montón de elementos adicionales en su HTML e incluso podría ser editado por el usuario con algo como Firebug.

Mi recomendación y lo que siempre he hecho es esperar no tener algunos de que la información publicada atrás, y acaba de establecer explícitamente dentro de la acción del controlador:

[HttpPost] 
    public ActionResult AddItem(FullOrder f) 
    { 
     // Next line is just showing that you should get the existing order 
     // from your data layer 
     FullOrder existingOrder = orderRepository.GetExistingOrder(); 

     // Now loop through f.OrderList and update the quantities 
     foreach(OrderItem item in f.OrderList) { 
      // Find the existing item and update the quantity. 
     } 

     // Now you have the original information from the DB along with 
     // updated quantities. 

     // Save results or do whatever is next 
     existingOrder.Save(); 
    } 
1

Por supuesto que no se puede hacer que funcione de esa manera

En primer lugar, debe saber que la vinculación del modelo se produce básicamente mediante el envío de datos desde las entradas en el lado del cliente. Html.DisplayTextFor helper no genera entrada, genera texto simple. Los textos no participan en los datos, enviados por el cliente cuando se envía el formulario, por lo que no los consigna en el modelo. Si echa un vistazo a la propiedad Request.Form, debería ver la prueba - no hay campos de descripción.

Lo que puede hacer si desea mostrar el texto y también permitir que la descripción participe en los valores del formulario, es usar el campo oculto.MVC obtuvo ayudante para este

@for (int i = 0; i < Model.FullOrder.OrderList.Count(); i++) 
    { 
     <tr> 
      <td> 
       @Html.DisplayTextFor(m => m.FullOrder.OrderList[i].Description) 
       @Html.HiddenFor(m => m.FullOrder.OrderList[i].Description) 
      </td> 
      <td> 
       @Html.TextBoxFor(m => m.FullOrder.OrderList[i].Qty, new { @style = "width:50px;" }) 
      </td> 
     </tr> 
    } 

De esta manera, la forma presentada contendrá valores de descripción también

+0

Es bueno saber que HiddenFor se presenta como etiquetas . – dotnetN00b

Cuestiones relacionadas