2011-03-13 60 views
1

我有一個控制器接受用戶名並通過並檢查數據庫。如果用戶通過身份驗證,我想調用另一個控制器上的重載操作。如何在控制器之間傳遞數據和重載操作?

我的最終目標是根據MySQL數據庫中的舊錶對用戶進行身份驗證(我有這部分工作)。一旦用戶通過身份驗證,我希望能夠「自動」將用戶轉發到內置的MVC註冊頁面,但我想使用從第一個控制器獲得的數據填充視圖中的一些字段(舊的數據庫信息) 。

當我嘗試類似下面的內容時,我得到有關Register()方法不明確的錯誤。我也嘗試使用[ActionName(「Register2」)]屬性,但然後返回的錯誤說它找不到一個名爲Register2的方法。

public class MigrateAccountController : Controller 
    { 
     OldUserRepository oldDb = new OldUserRepository(); 
     public ActionResult Index() 
     { 

      return View(); 
     } 
     [HttpPost] 
     public ActionResult Index(User u) 
     { 
      if (oldDb.isValid(u.username, u.password)) 
       return RedirectToAction("Register", "Account", u); 


      return View(u); 
     } 
    } 
    public class AccountController : Controller 
    { 
     public IFormsAuthenticationService FormsService { get; set; } 
     public IMembershipService MembershipService { get; set; } 

     protected override void Initialize(RequestContext requestContext) 
     { 
      if (FormsService == null) { FormsService = new FormsAuthenticationService(); } 
      if (MembershipService == null) { MembershipService = new AccountMembershipService(); } 

      base.Initialize(requestContext); 
     } 
     public ActionResult Register(User u) 
     { 
      return View(u); 
     } 
     public ActionResult Register() 
     { 
      ViewBag.PasswordLength = MembershipService.MinPasswordLength; 
      return View(); 
     } 
    } 

回答

2

首先,您不能在同一個動詞上可訪問的同一控制器上擁有相同的動作名稱。您需要更改動作的名稱或者使用不同的HTTP動詞:

public class AccountController : Controller 
{ 
    public IFormsAuthenticationService FormsService { get; set; } 
    public IMembershipService MembershipService { get; set; } 

    protected override void Initialize(RequestContext requestContext) 
    { 
     if (FormsService == null) { FormsService = new FormsAuthenticationService(); } 
     if (MembershipService == null) { MembershipService = new AccountMembershipService(); } 

     base.Initialize(requestContext); 
    } 

    [HttpPost] 
    public ActionResult Register(User u) 
    { 
     return View(u); 
    } 

    public ActionResult Register() 
    { 
     ViewBag.PasswordLength = MembershipService.MinPasswordLength; 
     return View(); 
    } 
} 

,並以行動之間傳遞數據,好吧,如果你正在使用GET,你可以重定向時,將它們作爲查詢字符串參數。

或者恕我直言一個更好的辦法是不要在這種情況下,重定向,而只是通過它傳遞正確的視圖模型返回相應的視圖:

[HttpPost] 
public ActionResult Index(User u) 
{ 
    if (oldDb.isValid(u.username, u.password)) 
    { 
     return View("~/Account/Register.aspx", u); 
    } 
    return View(u);  
} 
+0

完美無缺。現在,如果只有我可以接受訓練,像專家一樣思考...... =) – Pete 2011-03-13 22:56:41

+0

@Pete,別擔心,它會隨着時間和練習而來。 – 2011-03-13 23:00:45

0

在這種情況下,您可以使用TempData值。

相關問題