2015-01-06 36 views
0

我有一個看起來像MVC 4防僞未找到

@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僅在將信息發回服務器時才起作用,而不適用於基本的GET請求。

Here is the MSDN for 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(); 
} 

但是,我想指出上面的代碼更改打破了MVC的Post-Redirect-Get模式。您從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(); 
}