2012-01-24 15 views
7

Jestem całkiem nowy w MVC i naprawdę próbuję przyzwyczaić się do wiązania modelu. Mam prosty model, który utworzyłem w formie. Jednak, gdy TYLKO opublikuję ten formularz, wartości pola tekstowego przenoszą się do kontrolera. Potrzebuję również pola opisu, które jest wykonywane przy użyciu DisplayTextFor. Czy jest to coś, na co będę musiał przygotować niestandardowy segregator? Mogę wziąć skrót i po prostu uczynić opis tekstem tylko do odczytu bez ramki, więc wygląda na tekst, ale chcę zrobić to we właściwy sposób. Tu jest mój kodu:MVC3 Nie publikuję całego modelu

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; } 
} 

Oto Zobacz

<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> 

Oto Kontroler:

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

Czy istnieje sposób, że mogę dostać mój model do po prostu przejść na opis w poście, mimo że nie jest to ramka tekstowa na związany przedmiot z mojego modelu?

Odpowiedz

2

Jedyne dane, które zostaną zaksięgowane w twoim wniosku, to dane, które są dostępne w formularzu, który jest przesyłany (oczywiście, jeśli pola formularza są wyłączone, oczywiście). Możesz zastąpić to, co widzi kontroler, implementując custom model binder.

W tym przypadku swoją postać składa się z wielu wystąpień jednego pola tekstowego:

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

Jeśli chcesz opis i inne rzeczy wypełnione, muszą być obecne w formularzu. Jeśli one nie muszą być widoczne, a następnie można użyć pomocnika HiddenFor:

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

Zobacz również What does Html.HiddenFor do?

+0

dzięki za pomoc, dokładnie to, co potrzebne, aby wiedzieć. – mscard02

+0

Jeśli odpowiedź jest przydatna, kliknij strzałkę w górę, aby wskazać jako taką. –

0

Funkcja DisplayTextFor jedzie tylko do wyjścia, że ​​tekst DOM przeglądarki. Powiązanie MVC framework w zasadzie analizuje zmienne POST/GET i automatycznie ustawia te wartości w twoim modelu.

Jeśli chcesz powiązać dowolne dane automatycznie (np. Tekst opisu), musisz zapisać to w jakimś polu wejściowym i/lub ukrytym. Pola ukryte działają, ale są nieefektywne, ponieważ umieszczasz w kodzie HTML kilka dodatkowych elementów, które może nawet edytować użytkownik z Firebug.

Moje zalecenie i co zawsze odbywa się spodziewać, aby nie mieć niektóre z tych informacji zamieszczonych tyłu i po prostu ustawić go wyraźnie w akcji kontrolera:

[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

Oczywiście nie można zrobić to praca w ten sposób

Po pierwsze, powinieneś wiedzieć, że wiązanie modelu występuje w zasadzie przy użyciu wysyłania danych z wejść po stronie klienta. Pomocnik Html.DisplayTextFor nie generuje wejścia, generuje prosty tekst. Teksty nie uczestniczą w danych wysyłanych od klienta po przesłaniu formularza, więc nie są one związane z modelem. Jeśli spojrzysz na właściwość Request.Form, powinieneś zobaczyć dowód - nie ma pól opisu.

Co można zrobić, jeśli chcesz wyświetlić tekst, a także pozwolić, aby opis uczestniczył w wartościach formularza, to używać ukrytego pola.MVC dostaje pomocnika dla tego

@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> 
    } 

ten sposób formularz przedłożony będzie zawierać wartości opis too

+0

Warto wiedzieć, że HiddenFor renderuje jako znaczniki . – dotnetN00b

Powiązane problemy