0

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

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

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

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

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

仅当我new { id = Model.ProductId }的 ActionLink 中有此错误时才会发生此错误。

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

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

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

编辑 回答一些问题:

我的表格如下所示:

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

编辑

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

4

3 回答 3

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

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

于 2012-04-16T16:38:30.743 回答
2
@Html.ActionLink("Leave a Review", "AddReview", "Product", new { @id = Model.ProductId }, null)

如果您在此模型的 ProductId 属性中有一个有效值,这应该会生成一个如下所示的链接

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

确保ProductId正确加载了属性值。

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

于 2012-04-16T16:43:26.717 回答
0

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

于 2012-04-16T16:34:44.887 回答