动作链接和参数

本文关键字:参数 链接 | 更新日期: 2023-09-27 18:31:21

我正在建立一个有产品的网站,你可以留下对产品的评论。我在产品页面上有一个链接,上面写着"发表评论"

在我的代码中,它看起来像这样:

@Html.ActionLink("Leave a Review", "AddReview", "Product", new { id = Model.ProductId }, null)

当我运行我的应用程序时,链接工作正常,但是当我提交评论时,它崩溃并说:

参数字典包含参数 'id' 的空条目 方法的不可为空类型"System.Int32" 'System.Web.Mvc.ActionResult product(System.String, Int32)' in "MyProject.Controllers.ProductController"。可选参数 必须是引用类型、可为 null 的类型或声明为 可选参数。参数名称:参数

仅当我的操作链接中有new { id = Model.ProductId }时,才会发生此错误。

这可能看起来像 ProductId 为空,但这是不可能的。要首先加载产品页面,需要一个 ProductId,此外,我还使用了一个 RenderAction,该操作使用相同的 ID 在页面上显示有关该产品的评论:

@{Html.RenderAction("Reviews", "product", new { id = Model.ProductId});}

所以基本上,为什么我会收到此错误?它与GET和POST AddReview方法有关吗?我认为不应该考虑链接会拉动 GET,当我提交表格时,它应该是一个 POST。如何将产品 ID 放入表单中?

编辑要回答一些问题:

我的表单如下所示:

@using (Html.BeginForm("AddReview", "Product"))
{
    <p>Title @Html.TextBoxFor(x => x.Title)</p>
    <p>Rating: @Html.TextBoxFor(x => x.Rating)</p>
    <p>Body: @Html.TextBoxFor(x => x.Body)</p>
    <input type="submit" value="Save"/>
    Html.ActionLink("Cancel", "Index", "Home");
}

我生成的标签如下所示:

<a href="/Product/AddReview?ProductId=9">Leave a Review</a>

编辑

修复链接问题后,我意识到我仍然收到错误的原因是我的控制器中的重定向到操作调用被破坏。多么愚蠢的错误!

动作链接和参数

@Html.ActionLink("Leave a Review", "AddReview", "Product", new { @id = Model.ProductId }, null)

如果此模型的 ProductId 属性中具有有效的 valie,这将生成如下所示的链接

<a href="/Product/AddReview/9">Leave a Review</a>

请确保已正确加载ProductId属性值。

您可以使用@符号作为与 HTML 属性同名的参数的前缀。看到我用了@id而不是id

<a href="/Product/AddReview?ProductId=9">Leave a Review</a>

不好。您应该获得:

<a href="/Product/AddReview/9">Leave a Review</a>

或:

<a href="/Product/AddReview?id=9">Leave a Review</a>

因为控制器操作需要一个名为 id 的不可为空的 int 参数。您收到此错误网址的原因可能是因为您弄乱了路线。

听起来您没有在表单中设置 ProductId。您需要将表单操作设置为在路由中包含 id:@Html.BeginForm("AddReview","Product", new {Id = Model.ProductId})或包含 productId 的隐藏输入,例如 @Html.Hidden("id",Model.ProductId")