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

ASP.NET MVC视图中如何为@Html.ActionLink传递嵌套模型的Id

问题解决:仅传递模型Id到控制器Action

错误原因

视图中直接使用Product.Id访问属性是错误的——当前视图模型是SingleProduct,必须通过Model.Product.Id来访问嵌套的Product1对象的Id属性;同时要注意类型匹配:模型里的Id是double?(可空双精度类型),而控制器接收参数是long,需要做类型转换。

分步解决方案

1. 修复@Html.ActionLink的参数错误

修改ActionLink代码,正确访问模型属性并处理类型转换:

@if (Model.Product.Id.HasValue)
{
    @Html.ActionLink(
        "Delete",
        "DeleteProduct",
        new { id = (long)Model.Product.Id.Value },
        new { @class = "btn btn-danger" }
    )
}
  • 加HasValue判断避免空引用异常
  • 通过(long)强制转换为控制器要求的long类型

2. 处理表单POST提交的Id传递

控制器的DeleteProduct标记了[HttpPost],而ActionLink生成的是GET请求,若要通过表单POST传递Id,建议将Id放在隐藏域中(避免用户编辑):

<form asp-action="DeleteProduct" method="post">
    @* 用隐藏域存储Id,替代原TextBox *@
    @Html.HiddenFor(model => model.Product.Id)   
    <div class="form-group">
        <input type="submit" value="Confirm Delete" class="btn btn-primary" />
    </div>
</form>

此时控制器需要调整参数绑定,确保能正确获取表单中的Product.Id:

[HttpPost]
public IActionResult DeleteProduct([FromForm(Name = "Product.Id")] long id)  
{
    // 业务逻辑代码
}

或者通过参数名匹配(表单字段名是Product.Id,模型绑定会自动映射到product_Id):

[HttpPost]
public IActionResult DeleteProduct(long product_Id)  
{
    // 业务逻辑代码
}

3. 修正原生a标签的错误

原视图中的a标签同样存在属性访问错误,若要保留GET方式(不推荐删除操作使用GET,存在CSRF风险),需修改为:

<a href="Update_Delete/DeleteProduct?id=@(long)Model.Product.Id.Value">Confirm Delete</a>

完整修改后的视图示例

@model SingleProduct
<div class="row">
    <div class="col-md-4">
        <div asp-validation-summary="ModelOnly" class="text-danger"></div>
        <div class="form-group">
            @Html.LabelFor(model => model.Product.Title)
            @Html.TextBoxFor(model => model.Product.Title)
        </div>
        <div class="form-group">
            @Html.LabelFor(model => model.Product.Body_html)
            @Html.TextBoxFor(model => model.Product.Body_html)
        </div>

        <form asp-action="DeleteProduct" method="post">
            @Html.HiddenFor(model => model.Product.Id)   
            <div class="form-group">
                @if (Model.Product.Id.HasValue)
                {
                    @Html.ActionLink(
                        "Delete(GET方式,不推荐)",
                        "DeleteProduct",
                        new { id = (long)Model.Product.Id.Value },
                        new { @class = "btn btn-warning me-2" }
                    )
                }
                <input type="submit" value="Confirm Delete(POST方式)" class="btn btn-danger" />
            </div>
        </form>
    </div>
</div>

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.20 13:50:10