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

本文关键字:控制器 返回 视图 调用 另一个 | 更新日期: 2023-09-27 17:56:26

我从登录控制器调用操作来验证用户,一旦用户通过身份验证,我想调用出主管操作,具体取决于用户的角色,并显示相应的视图。

我可以中断AuthenticateUserByCardRedirectToAction似乎不起作用。

不确定我试图做的是否偏离了 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});

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

jQuery post 并且get忽略从服务器返回的 301 浏览器重定向。您通常需要自己处理它们。这可能会变得混乱:如何在jQuery Ajax调用后管理重定向请求

在这种情况下,您真正需要的是返回方法的选择,但使它们返回显式视图(非隐式)。默认设置始终是基于 IIS 调用的方法(即"AuthenticateUserByCard")返回视图,除非您指定视图。

例如

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(只是一个想法):)