2011-01-06 42 views
1

場景:MVC2 AJAX - 根據返回的數據確定UpdateTargetId

我創建了一個應用程序MVC2登錄表單。

如何我做它

的形式提交到驗證用戶名/密碼的MVC2行動。如果驗證失敗,則該操作返回用戶再次嘗試的表單(部分視圖)。如果它通過驗證,則該操作將返回用戶在登錄之前訪問的頁面(視圖)。

我希望發生什麼:

1 - 當表單提交,用戶成功驗證,返回的結果應該替換當前頁面(如會發生什麼,如果你不設置UpdateTargetId) 。

2 - 當提交表單並且用戶未通過驗證時,返回的結果應該替換表單(就像將UpdateTargetID設置爲表單的包含元素時發生的情況一樣)。

問題:

我可以做這兩點工作,但不是在同一時間。我可以讓它總是替換當前頁面,或者總是替換UpdateTargetId元素的內容。但我需要它能夠做或取決於用戶是否成功驗證。

我需要什麼

理想的解決方案是能夠檢查Ajax請求的結果,並決定是否使用UpdateTargetId(僅更換形式)或沒有(更換整個頁面) 。我期望它會涉及到jQuery的一些工作(假設它是可能的),但我並沒有真正用jquery那麼棒,但還沒有弄清楚如何自己做。如果不能這樣做,我也開放其他方法/解決方案,使其以類似的方式工作。

在此先感謝..

根據要求。行動的代碼。但正如我所說。這是每個mvc應用程序默認提供的標準LogOn操作。唯一的區別是它在驗證失敗時返回一個局部視圖。

[HttpPost] 
    [MedLife.Code.Compression.CompressFilter] 
    public ActionResult SignIn(LogOnModel model, string returnUrl) 
    { 
     if (ModelState.IsValid) 
     { 
      if (MembershipService.ValidateUser(model.UserName, model.Password)) 
      { 
       FormsService.SignIn(model.UserName, model.RememberMe); 
       if (!String.IsNullOrEmpty(returnUrl)) 
       { 
        return Redirect(returnUrl); 
       } 
       else 
       { 
        return RedirectToAction("Index", "Home"); 
       } 
      } 
      else 
      { 
       ModelState.AddModelError("", "The user name or password provided is incorrect."); 
      } 
     } 

     // If we got this far, something failed, redisplay form 
     return PartialView("Overlays/LoginControl", model); 
    } 

回答

1

讓我們假設如果登錄名/密碼無效,返回帶有字符串「INVALID」的Json結果。然後你使用UpdateTargetId。

如果Json結果!=「INVALID」,那麼您將用新的部分頁面替換容器。

這就是我這樣做,它很好。 :-)

+0

這很好,但問題更多**我如何讓它使用UpdateTargetId或不。我要麼在ajax中設置UpdateTargetId,我不要。我如何確定是否以編程方式使用它取決於這個字符串是否像你所建議的那樣存在。 – DanielJW 2011-01-06 13:14:11

+0

得到它的工作可接受這樣做(或至少非常類似於這種方式)。 – DanielJW 2011-01-06 15:16:44

1

在你的服務器端代碼中,檢查驗證是否有效,如果不是,返回一個RedirectToAction給你需要的任何全視圖。

您所遇到的問題是所有的應用程序邏輯,而不是顯示邏輯,所以應該在控制器中完成,而不是在視圖中完成,以便將您的疑慮分開。

你必須做一個RedirectToAction(即,不只是返回View(「myViewWhenInvalid」);)否則視圖將在UpdateTargetID中呈現,這看起來不太好。

編輯:

即:

public ActionResult myLoginAction(string name, string pwd) 
{ 
// do the login stuff 
if (loggedIn) 
{ 
return RedirectToAction(...); 
} 
else 
{ 
return MyJsonAction(); 
} 
} 

public MyJsonAction() 
{ 
return some Json...; 
} 

PS:我感冒了,所以懶得去查我的想法。