2012-04-16 3 views
0

Я создаю сайт, на котором есть продукты, и вы можете оставлять отзывы о товарах. У меня есть ссылка на страницу продукта, который говорит: «Оставить отзыв»ActionLink и параметры

В моем коде это выглядит следующим образом:

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

Когда я запускаю мое приложение ссылка работает нормально, но когда я представить обзор он падает и говорит:

словарь параметров содержит нулевой элемент для параметра «идентификатора» из ненулевых типа «System.Int32» для метода «System.Web.Mvc.ActionResult продукт (System.String , Int32) 'в ' MyProject.Controllers.P roductController. Необязательный параметр должен быть ссылочным типом, нулевым типом или быть объявлен как необязательный параметр . Имя параметра: параметры

Эта ошибка возникает только в том случае, если у меня есть new { id = Model.ProductId } в моей ActionLink.

Это может показаться, что ProductId имеет значение null, но это невозможно. Чтобы загрузить страницу продукта в первом месте PRODUCTID необходим, плюс я использую RenderAction, который отображает отзывы об этом продукте на странице, используя тот же идентификатор:

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

Так в основном, почему я получаю эту ошибку ? Это связано с тем, что существует метод GET и POST AddReview? Я не думаю, что это должно учитывать, что ссылка будет тянуть GET, и когда я отправлю форму, она должна быть POST. Как я могу получить productId в форме?

EDIT Чтобы ответить на некоторые вопросы:

Моя форма выглядит следующим образом:

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

EDIT

После исправления проблемы связи я понял, что причина, по которой я все еще получал сообщение об ошибке, была вызвана нарушением вызова RedirectToAction в моем контроллере. Какая глупая ошибка!

ответ

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

Это должно сгенерировать ссылку, как показано ниже, если у вас есть действительный Вали в вашей собственности PRODUCTID для этой модели

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

Убедитесь, что значение ProductId Property загружена правильно.

Вы можете использовать символ @ как префикс для параметров, имеющих то же имя, что и для атрибутов HTML. См. Я использовал @id вместо id

+0

Это создает правильную ссылку. Я все еще получаю сообщение об ошибке, и я подозреваю, что это потому, что я не загружаю значение в свою форму правильно ... – Johannes

+0

И все же обзор по-прежнему публикуется. – Johannes

0

Похоже, что вы не устанавливаете ProductId в форму. Вам нужно либо установить действие формы, чтобы включить идентификатор в маршрут: @Html.BeginForm("AddReview","Product", new {Id = Model.ProductId}) или включить скрытый ввод для productId, например. @Html.Hidden("id",Model.ProductId")

+0

Как передать идентификатор в форму? – Johannes

+0

@DarinDimitrov, лучше передать идентификатор в виде действия или в скрытом? Плюсы и минусы ... – Romias

+0

@Romias Я думаю, что значение формы выигрывает, если они разные. –

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.Причина, по которой вы получаете этот неправильный URL, может быть из-за того, что вы перепутали свои маршруты.

+0

Я не трогал мои маршруты. Это настройка по умолчанию {controller}/{action}/{id}. – Johannes

+0

Возможно, это ваша форма. Вы пробовали включить параметр маршрута: '@using (Html.BeginForm (« AddReview »,« Продукт », новый {id = Model.ProductId}, FormMethod.Post))'? –

+0

Итак, я получаю ошибку, но отзывы все еще публикуются. Это глупо. – Johannes

Смежные вопросы