从另一个控制器调用控制器并返回一个视图

时间:2014-04-03 08:35:09

标签: c# jquery asp.net-mvc-4 .net-4.0

我从Login控制器调用一个Action来验证用户,一旦用户通过身份验证,我想调用 Cashier Supervisor 操作,具体取决于用户的角色,并显示相应的视图。

我可以暂时AuthenticateUserByCard,但RedirectToAction似乎无法正常工作。

我不确定我尝试做的是偏离MVC架构,如果是这样,请建议正确的方法来执行此操作

登录控制器:

public class LoginController : Controller
    {
        public ViewResult Index()
        {
            return View();
        }

        [HttpPost]
        public ActionResult AuthenticateUserByCard(string token)
        {
            //Authenticate user and redirect to a specific view based on the user role
            Role role = GetRoleByToken(token);

            if(role.UserType == UserType.Supervisor)
                return RedirectToAction("Supervisor", "Login", new { id = token });
            else
                return RedirectToAction("Cashier", "Login", new { id = token });

            return null;
        }

        public ActionResult Supervisor(string id)
        {
            //Do some processing and display the Supervisor View
            return View();
        }

        public ActionResult Cashier(string id)
        {
            //Do some processing and display the Cashier View
            return View();
        }
}

Java脚本:

$.get("/Login/AuthenticateUserByCard",{token:token});

1 个答案:

答案 0 :(得分:0)

jQuery postget忽略从服务器返回的301个浏览器重定向。您通常需要自己处理它们。这可能会变得混乱:How to manage a redirect request after a jQuery Ajax call

在这种情况下你真正需要的是返回方法的选择,但让它们返回显式视图(不是隐式的)。除非您指定视图,否则默认情况下将始终基于IIS调用的方法返回视图,即“AuthenticateUserByCard”。

e.g。

public class LoginController : Controller
{
    public ViewResult Index()
    {
        return View();
    }

    [HttpPost]
    public ActionResult AuthenticateUserByCard(string token)
    {
        //Authenticate user and redirect to a specific view based on the user role
        Role role = GetRoleByToken(token);

        if(role.UserType == UserType.Supervisor)
            return Supervisor(token);
        else
            return Cashier(token);

        return null;
    }

    public ActionResult Supervisor(string id)
    {
        //Do some processing and display the Supervisor View
        return View("Supervisor");
    }

    public ActionResult Cashier(string id)
    {
        //Do some processing and display the Cashier View
        return View("Cashier");
    }

但这不会改变URL。如果您需要,也可以尝试我链接的其他答案。你基本上处理jQuery中的重定向并转到新页面。

或者,要更改URL,请将所需的URL放入返回视图的隐藏字段中,并提取该值以更新浏览器URL(只是想一想):)