簡體   English   中英

ASP MVC將視圖中的模型數據作為表單數據傳遞回

[英]ASP MVC passing model data in view back as form data

我得到了以下Razor視圖,該視圖顯示了HDD列表,以便向用戶添加並添加到購物車。 當用戶按下HDD每行旁邊的按鈕時,它將把數量和HDD的身份傳遞給控制器​​。 但是,盡管每個HDD的ID都可以正確顯示,但是當我檢查控制器的參數時,“ hddId”始終為1,“ quantity”正確為5。

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

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

正如其他人所說,這是行不通的,因為在您提交時,您正在提交表中的每一行,而不僅僅是單擊的行。

一種選擇是執行他們在本文中建議的操作:

http://federmanscripts.com/2010/01/12/form-and-table-row-nesting-workaround/

也就是說,使用javascript,您可以將按鈕按下時的表單值復制到隱藏行並提交。

我通過使用按鈕type =“ submit”而不是輸入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>
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM