samedi 19 avril 2014

c# - appeler le contrôleur d'un autre contrôleur et retourner à un affichage - Stack Overflow


I call an Action from a Login controller to authenticate users, once the user is authenticated I would like to call either the Cashier or the Supervisor action, depending on the user's role, and display the appropriate view.


I can break on AuthenticateUserByCard but RedirectToAction doesn't seem to be working.


I'm not sure if what I'm trying to do is deviating from the MVC architecture, if so please suggest the correct way to do this


Login controller:


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 Script:


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



jQuery post and get ignore 301 browser redirects returned from the server. You would normally need to handle them yourself. This can get messy: How to manage a redirect request after a jQuery Ajax call


All you really need in this case is to return the choice of methods, but make them return explicit views (not implicit). The default would always be to return the view based on the IIS-called method i.e. "AuthenticateUserByCard" unless you specify the view.


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");
}

This will not change the URL though. If you need that too try the other answer I linked. You basically handle the redirect in jQuery and goto the new page.


Alternatively, to change the URL, put the desired URL into a hidden field of the returned views and extract that value to update the browser URL (just a thought) :)



I call an Action from a Login controller to authenticate users, once the user is authenticated I would like to call either the Cashier or the Supervisor action, depending on the user's role, and display the appropriate view.


I can break on AuthenticateUserByCard but RedirectToAction doesn't seem to be working.


I'm not sure if what I'm trying to do is deviating from the MVC architecture, if so please suggest the correct way to do this


Login controller:


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 Script:


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


jQuery post and get ignore 301 browser redirects returned from the server. You would normally need to handle them yourself. This can get messy: How to manage a redirect request after a jQuery Ajax call


All you really need in this case is to return the choice of methods, but make them return explicit views (not implicit). The default would always be to return the view based on the IIS-called method i.e. "AuthenticateUserByCard" unless you specify the view.


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");
}

This will not change the URL though. If you need that too try the other answer I linked. You basically handle the redirect in jQuery and goto the new page.


Alternatively, to change the URL, put the desired URL into a hidden field of the returned views and extract that value to update the browser URL (just a thought) :)


0 commentaires:

Enregistrer un commentaire