You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

ASP.NET MVC:如何从View向Controller传递两个值?

解决ASP.NET Core表单传值失败问题

问题根源

  1. <label> 不是有效表单控件:你用<label>传递固定值,但label仅用于关联表单元素,不会被表单提交,导致selection参数始终无法传递到控制器。
  2. 控制器代码存在拼写错误:[Httppost]应为[HttpPost],returnView应为return View,这些语法错误会导致请求无法正确匹配方法。
  3. 单表单多按钮场景下,按钮的value可被正确提交,但前提是表单控件配置正确。

修正方案

方案1:用隐藏输入框传递固定值(推荐)

将视图中的<label>替换为<input type="hidden">,同时修正控制器的拼写错误:

修正后的视图代码

<tbody>
    <form action="~/Home/ReadOption" method="post">
        <!-- 用hidden input传递固定值,这是表单可识别的标准控件 -->
        <input type="hidden" name="selection" value="delivery" />
        @foreach (var item in Model)
        {
            <tr>
                <td>
                    <button type="submit" class="btn btn-link" value="@item.DeliveryNumber" name="identi">
                        @item.DeliveryNumber
                    </button>
                </td>
                <td>@item.OrderNumber</td>
                <td>@item.RemitNumber</td>
                <td>@item.CantPhotos</td>
                <td>@item.Date</td>
                <td>@item.Time</td>
            </tr>
        }
    </form>
</tbody>

修正后的控制器代码

[HttpPost] // 修正拼写:Httppost → HttpPost
public IActionResult ReadOption(string selection, string identi)
{
    List<OrderViewModel> OrderList;

    try
    {
        identi = CleanString(identi);

        if (string.IsNullOrEmpty(identi)) // 简化空值判断逻辑
        {
            return View("Index"); // 修正拼写:returnView → return View
        }

        switch (selection)
        {
            case "order":
                OrderList = ViewOrder(identi);
                return View("Order", OrderList); // 修正变量名大小写:orderList → OrderList
            case "remit":
                OrderList = ViewRemittance(identi);
                return View("Order", OrderList);
            case "delivery":
                OrderList = ViewDelivery(identi);
                return View("Order", OrderList);
            default:
                return View(); // 添加default分支,避免无匹配场景下无返回值
        }
    }
    catch (Exception ex)
    {
        ViewBag.error = ex.Message;
        return View("Error");
    }
}

方案2:每行独立表单(适用于需不同固定值的场景)

如果后续需要为不同行设置不同的selection值,可将表单放到循环内部:

<tbody>
    @foreach (var item in Model)
    {
        <tr>
            <td>
                <form action="~/Home/ReadOption" method="post">
                    <input type="hidden" name="selection" value="delivery" />
                    <button type="submit" class="btn btn-link" value="@item.DeliveryNumber" name="identi">
                        @item.DeliveryNumber
                    </button>
                </form>
            </td>
            <td>@item.OrderNumber</td>
            <td>@item.RemitNumber</td>
            <td>@item.CantPhotos</td>
            <td>@item.Date</td>
            <td>@item.Time</td>
        </tr>
    }
</tbody>

关键说明

  • 隐藏输入框:<input type="hidden">是表单的标准控件,提交时会自动将name和value传递到服务器,这是传递固定值的正确方式。
  • 拼写检查:ASP.NET Core的特性和方法名区分大小写,[HttpPost]和return View()的拼写错误会直接导致请求匹配失败。
  • 变量名一致性:控制器中返回视图时,需保证传递的变量名与定义的变量名一致,否则会出现编译错误。

内容的提问来源于stack exchange,提问作者popo

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.18 14:50:33