2015-01-06 2 views
0

У меня есть форма, которая выглядит какMVC 4 Anti-Подделка Не найдена

@using(Html.BeginForm()) 
{ 
    @Html.AntiForgeryToken() 

    <!-- Some form inputs --> 

    <div>@Html.ActionLink("LinkText", "MyAction")</div> 
} 

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

[ValidateAntiForgeryToken} 
public ActionResult MyAction() 
{ 
    return View(); 
} 

Когда я нажимаю на ссылку действий, я получаю ошибка: The required anti-forgery form field "__RequestVerificationToken" is not present.

+1

Вы закрываете атрибут ValidateAntiForgeryToken с "]" не так ли? –

ответ

1

Ссылка на действие выполняет запрос GET на сервер. Во время запроса GET поля формы не передаются, включая скрытое поле для AntiForgeryToken. Вот почему вы получаете ошибку. AntiForgeryTokens работает только при отправке информации POSTing на ваш сервер, а не в качестве основного запроса GET.

Here is the MSDN для помощника AntiForgeryToken. Обратите внимание, что государства:

Generates a hidden form field (anti-forgery token) that is validated when the form is submitted.

Для того, чтобы пройти AntiForgeryToken, вам нужно POST/отправить форму. Измените следующее, и все должно работать по назначению.

@using(Html.BeginForm("MyAction", "MyController")) 
{ 
    @Html.AntiForgeryToken() 

    <!-- Some form inputs --> 

    <div><input type="submit" value="MyText"/></div> 
} 

[HttpPost] 
[ValidateAntiForgeryToken] 
public ActionResult MyAction() 
{ 
    return View(); 
} 

Однако, я хотел бы отметить, что приведенный выше код изменяет Перерывы Post-Redirect-Get шаблон MVC. Ваше возвращение от HttpPost ActionResult должно быть возвращено RedirectToAction("Something") в противоположность представлению.

+0

Спасибо! которые решили проблему. – Rhs

+0

@Rhs - удивительный! Обязательно отметьте один из ответов, как принято, чтобы он поставил вопрос на вопрос: – Tommy

0

[ValidateAntiForgeryToken]

проверяется на POST действия, а не с GET. Таким образом, ваш код должен выглядеть следующим образом:

@using(Html.BeginForm()) 
{ 
    @Html.AntiForgeryToken() 

    <!-- Some form inputs --> 

    <input type="submit" value="Submit" /> 
} 

и ваш метод действия:

[HttpPost] 
[ValidateAntiForgeryToken] 
public ActionResult MyAction() 
{ 
    return View(); 
} 
Смежные вопросы