2012-09-23 38 views
0

我得到以下Razor視圖,顯示硬盤列表,以便用戶添加到購物車中。當用戶按下每一行HDD旁邊的按鈕時,它會將數量和HDD的身份傳遞給控制器​​。但是,當我檢查控制器的參數時,雖然每個硬盤ID都正確顯示,但「hddId」始終爲1,「數量」正確5。ASP MVC將模型數據作爲表單數據傳回

@model IEnumerable<TestStore.Models.Hdd> 

@{ 
    ViewBag.Title = "Index"; 
} 

<h2>Index</h2> 

<p> 
    @Html.ActionLink("Create New", "Create") 
</p> 
@using(Html.BeginForm("AddToCart","Cart")){ 
<table> 
    <tr> 
     <th> 
      Ident 
     </th> 
     <th> 
      Brand 
     </th> 
     <th> 
      Name 
     </th> 
     <th> 
      Model 
     </th> 
     <th> 
      Speed 
     </th> 
     <th> 
      Capacity 
     </th> 
     <th> 
      Cache 
     </th> 
     <th></th> 
    </tr> 

@foreach (var item in Model) { 
    <tr> 
     <td> 
      @Html.DisplayFor(modelItem => item.hddId) 
     </td> 
     <td> 
      @Html.Hidden("hddId", item.hddId) 
      @Html.Hidden("quantity", 5) 
      @Html.DisplayFor(modelItem => item.brand) 
     </td> 
     <td> 
      @Html.DisplayFor(modelItem => item.name) 
     </td> 
     <td> 
      @Html.DisplayFor(modelItem => item.model) 
     </td> 
     <td> 
      @Html.DisplayFor(modelItem => item.speed) 
     </td> 
     <td> 
      @Html.DisplayFor(modelItem => item.capacity) 
     </td> 
     <td> 
      @Html.DisplayFor(modelItem => item.cache) 
     </td> 
     <td> 
      <input type="submit" value="Add to Cart" /> 
     </td> 
    </tr> 

} 

</table> 
} 
+0

但你硬編碼5 ?? – codingbiz

+0

是的,我對「數量」硬編碼5,而控制器對該參數確實看到5。 – MooCow

+0

您的提交按鈕沒有引用特定的行,我認爲將提交整個表單而不是單擊它的行。我認爲應該有一種方法來指定每行的ID和數量,以便提交知道要提交什麼值 – codingbiz

回答

0

Codingbiz是正確的。提交按鈕不是指任何特定的行,而是整個表。我懷疑「hddId」總是爲「1」的原因是因爲這是提交表單時看到的第一個「hddId」引用。我改之以@using(Html.BeginForm(...))是@foreach循環內部,每一行都有自己的表,並提交按鈕:

@foreach (var item in Model) { 

    <tr> 
     @using(Html.BeginForm("AddToCart","Cart")){ 
     <td> 
      @Html.DisplayFor(modelItem => item.hddId) 
     </td> 
     <td> 
      @Html.Hidden("hddId", item.hddId) 
      @Html.Hidden("quantity", 5) 
      @Html.DisplayFor(modelItem => item.brand) 
     </td> 
     <td> 
      @Html.DisplayFor(modelItem => item.name) 
     </td> 
     <td> 
      @Html.DisplayFor(modelItem => item.model) 
     </td> 
     <td> 
      @Html.DisplayFor(modelItem => item.speed) 
     </td> 
     <td> 
      @Html.DisplayFor(modelItem => item.capacity) 
     </td> 
     <td> 
      @Html.DisplayFor(modelItem => item.cache) 
     </td> 
     <td> 
      <input type="submit" value="Add to Cart" /> 
     </td> 
     } 
    </tr> 
} 
+0

雖然這可能起作用,但它不是合法的HTML。 ''只能包含''和'​​'元素。這不能保證它可以在任何瀏覽器中運行,或者將來在任何瀏覽器中繼續運行。 –

+0

我將@using(...)塊移動到塊之外,那麼它仍然會被認爲是非法html格式,因爲它仍然在

標記內? – MooCow

+0

否。表標記內唯一有效的元素是標題,col,colgroup,thead,tbody或tr。 @using不會出現在呈現的html中,它只是一種呈現表單標記及其內的所有內容的機制。表格在表格標籤內或在tr標籤內僅在th和td標籤內不合法。 –

0

我通過使用button type =「submit」而不是input type =「submit」來解決驗證問題。通過將ID號傳遞給控制器​​,它仍能正常工作。

@using(Html.BeginForm("AddToCart","Cart")){ 
<table> 
    <tr> 
    //header stuff here 
    </tr> 

    @foreach (var item in Model) { 
    //row data goes here 
    //remove hidden field reference to @item.hddId 
    <tr> 
    <td> 
     <button type="submit" value="@item.hddId" name="hddId">Add to Cart</button> 
    </td> 
    </tr> 
</table> 
} 
相關問題