如何在控制器和重载操作之间传递数据?

时间:2011-03-13 21:57:42

标签: asp.net asp.net-mvc-3

我有一个控制器,它接受用户名并传递和检查数据库。如果用户通过身份验证,我想在另一个控制器上调用重载操作。

我的最终目标是根据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 个答案:

答案 0 :(得分: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);       
}

答案 1 :(得分:0)

在这种情况下,您可以使用TempData值。