ActionLink和参数

时间:2012-04-16 16:27:48

标签: c# asp.net-mvc-3

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

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

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

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

  

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

如果我的ActionLink中有new { id = Model.ProductId },则只会出现此错误。

这似乎是ProductId为null,但这是不可能的。要首先加载产品页面,需要使用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调用在我的控制器中被破坏了。多么愚蠢的错误!

3 个答案:

答案 0 :(得分: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>

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

答案 1 :(得分: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 attribues具有相同的名称。请参阅我使用@id而不是id

答案 2 :(得分:0)

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