2012-07-26 41 views
0

這可能是設計或它可能是我或我沒有做的事情。MVC 4 jquery Ajax調用返回登錄頁面html

我有一個MVC 4應用程序,AccountController正在使用Authorize屬性。當用戶在登錄頁面上時,有一個Teller發佈日期在他們登錄後使用。我試圖捕獲名稱字段上的更改事件,該字段工作正常,並且觸發Jquery函數以獲取發行日期。

這裏是JQuery的阿賈克斯功能:

function update_issue_date() { 
var userName = $('#UserName').val(); 

$.ajax({ 
    type: 'GET', 
    url: '/Account/GetIssueDate', 
    async: true, 
    data: 
    { 
     userName: userName 
    }, 
    success: function(data) { 
     $('#IssueDate').val(__format_date_for(new Date(data.issueDate))); 
    } 
}); 

在的AccountController我有如下因素作用:

 [AllowAnonymous] 
    public ActionResult GetIssueDate(string userName) 
    { 
     var issueDate = DateTime.Now.Date; 

     if (userName.Length > 0) 
     { 
      var user = userRepo.GetUser(userName); 
      //var user = user_repository.get_all().FirstOrDefault(x => x.user_name == userName); 
      var currentDate = DateTime.Now.Date; 

      issueDate = (user == null || user.IssueDate < currentDate) ? currentDate : user.IssueDate; 
     } 

     return Json(new { issueDate = issueDate.ToShortDateString() }, JsonRequestBehavior.AllowGet); 
    } 

這是會發生什麼,如果我有在網絡禁用授權的東西。 config,那麼這個函數按原樣返回正確的發佈日期。但是,如果我已啓用Authorize事件,那麼GetIssueDate Action似乎不會被解僱。我得到了登錄頁面的HTML。

我覺得即使我在這個Action上有[AllowAnonymous]屬性,應用程序在從Jquery函數中調用時似乎忽略了這一點,並且不允許它觸發。

有沒有辦法解決這個問題,或者是另一種方法來做我想做的事情?

謝謝。

+0

歡迎StackOverflow上。如果答案解決了您的問題,[您可以接受此答案](http://meta.stackexchange.com/a/5235/170863)。然後,您也可以用灰色向上箭頭向上投票一個或多個答案。 – 2012-07-26 23:18:07

+0

您應該不必* AllowAnonymous *才能使Ajax調用正常工作。如果會話已建立,會話cookie將與請求一起發送(您*使用會話cookie?)。 – 2012-07-26 23:26:15

+0

我知道我使用cookie做的唯一事情是在登錄時使用FormsAuthentication.SetAuthCookie,但用戶在這一點上並未真正登錄。你必須原諒我,在這個Web編程方面還是一個新鮮事。 – 2012-07-26 23:28:35

回答

0

您似乎正在使用您的web.config來控制授權。這不是你在ASP.NET MVC應用程序中應該做的事情。在ASP.NET MVC中,您使用[Authorize]屬性來修飾需要授權的控制器/操作。與之相對應的是:[AllowAnonymous]屬性。

所以從你的web.config中刪除所有<authorization><deny users="?" /></authorization>東西,然後,如果你想在你的網站上的所有行動,要求除了那些裝飾着認證[AllowAnonymous],你可以註冊[Authorize]屬性作爲全球行動的過濾器。這是在~/App_Start/FilterConfig.cs文件中完成:

public class FilterConfig 
{ 
    public static void RegisterGlobalFilters(GlobalFilterCollection filters) 
    { 
     filters.Add(new AuthorizeAttribute()); 
     filters.Add(new HandleErrorAttribute()); 
    } 
} 

當然在web.config中,你需要保持authentication部分,其指示正在使用窗體身份驗證ASP.NET:

<authentication mode="Forms"> 
    <forms loginUrl="~/Account/Login" timeout="2880" /> 
</authentication> 
+0

甜,這是做到了。我曾嘗試刪除,但我也刪除了全局過濾器,這使得它轉到主頁而不是登錄。我讀了一些地方,以便使用授權將這些行添加到我的web.config和全局過濾器。顯然,該博文是不正確的。我已經接受了你的答案,因爲它像魅力一樣工作。再次,謝謝。 – 2012-07-27 05:58:28