2013-03-29 15 views
0

使用asp.net mvc4。我無法從我的應用中打開〜/帳戶/註銷。默認路由應該捕獲它並將其路由到適當的控制器。在routeconfig.cs中asp.net mvc4註銷鏈接路由未找到

routes.MapRoute(
      name: "Home", 
      url: "{controller}/{action}/{id}", 
      defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional } 
     ); 

不應該那麼抓網址嗎?

代碼的鏈接創建

@Html.ActionLink("Signout", "LogOff", "Account" , new{controller = "Account" 
, action = "LogOff"}, new{ target = "_self"}) 

出於某種原因,是推動我瘋了,我不能打

// 
    // POST: /Account/LogOff 

    [HttpPost] 
    [ValidateAntiForgeryToken] 
    public ActionResult LogOff() 
    { 
     var fam = FederatedAuthentication.WSFederationAuthenticationModule; 
     fam.SignOut(false); 
     SignOutRequestMessage signOutRequest = new SignOutRequestMessage(new Uri(fam.Issuer), fam.Realm); 
     return new RedirectResult(signOutRequest.WriteQueryString()); 

    } 

我已經試過之前和之後的「主頁添加路由「maproute。兩人似乎都沒有工作。我在這裏錯過了什麼?我寫了幾十個asp.net mvc應用程序,並沒有遇到這個問題。這是在吹我的腦海。請幫忙。

乾杯, 〜CK

+0

看起來很完美。我的猜測是路線和鏈接得到匹配的權利,但方法沒有。不能指出任何明確的*理由*。我會開始刪除antiforgerytoken。如果用戶僞造註銷,任何人都不會受到影響 –

回答

0

哦,我是做通過鏈接點擊一個得到。該方法用於發佈。我將鏈接封裝在表單標籤中,然後點擊鏈接,我照常提交表單。這解決了這個問題,並能夠打我的控制器方法。

+0

爲什麼不從行爲中移除[HttpPost]屬性? – edgi

+0

這是正確的方法,在鏈接和發佈周圍封裝一個表單。我不確定爲什麼這會得到一個投票表決,除了這個人不明白爲什麼MVC 4發佈LogOff需要一個職位。這是由於AntiForgeryToken需要返回服務器以防止惡意網站等,通過直接鏈接到LogOff操作來關閉用戶。 –

0

您需要從LogOff()操作中刪除[HttpPost]屬性。 @Html.ActionLink()將創建一個常規鏈接(<a>標籤),因此點擊它將發出一個GET請求。

+0

我不能投票,但這是不正確的。該帖子是AntiForgeryToken所必需的 –

1

原因是因爲你有一個[HttpPost]。它基本上意味着它從表單提取來自提交按鈕的請求,但由於您沒有使用提交按鈕既不使用表單,您的註銷操作也會被跳過。

您可以通過2個原因解決此問題:

1)更改[HttpPost][HttpGet]

2)只需簡單地引導你的鏈接到你的動作:

@Html.ActionLink("Signout", "LogOff", "Account")