Sto lavorando a una soluzione ASP.NET MVC con un numero di menu diversi. Il menu da visualizzare dipende dal ruolo dell'utente attualmente connesso.Come reindirizzare l'azione MVC senza restituire 301? (utilizzando MVC 4 beta)
In MVC 3 avevo un codice personalizzato per supportare questo scenario, avendo un unico metodo di controllo che restituirebbe il menu corretto. Lo farebbe differendo la richiesta al controller appropriato e l'azione in base all'utente corrente.
Questo codice sembra essere danneggiato in MVC 4 e sto cercando aiuto per risolverlo.
In primo luogo, ho aggiunto una classe TransferResult di supporto per eseguire il reindirizzamento:
public class TransferResult : RedirectResult
{
#region Transfer to URL
public TransferResult(string url) : base(url)
{
}
#endregion
#region Transfer using RouteValues
public TransferResult(object routeValues) : base(GetRouteUrl(routeValues))
{
}
private static string GetRouteUrl(object routeValues)
{
var url = new UrlHelper(new RequestContext(new HttpContextWrapper(HttpContext.Current), new RouteData()), RouteTable.Routes);
return url.RouteUrl(routeValues);
}
#endregion
#region Transfer using ActionResult (T4MVC only)
public TransferResult(ActionResult result) : base(GetRouteUrl(result.GetT4MVCResult()))
{
}
private static string GetRouteUrl(IT4MVCActionResult result)
{
var url = new UrlHelper(new RequestContext(new HttpContextWrapper(HttpContext.Current), new RouteData()), RouteTable.Routes);
return url.RouteUrl(result.RouteValueDictionary);
}
#endregion
public override void ExecuteResult(ControllerContext context)
{
HttpContext httpContext = HttpContext.Current;
httpContext.RewritePath(Url, false);
IHttpHandler httpHandler = new MvcHttpHandler();
httpHandler.ProcessRequest(HttpContext.Current);
}
}
In secondo luogo, ho modificato T4MVC per emettere alcuni metodi di controllo di supporto, con conseguente ogni controller di avere questo metodo:
protected TransferResult Transfer(ActionResult result)
{
return new TransferResult(result);
}
Questo mi ha permesso di avere un'azione del controller condiviso per restituire un menu, senza dover confondere le viste con qualsiasi logica condizionale:
public virtual ActionResult Menu()
{
if(Principal.IsInRole(Roles.Administrator))
return Transfer(MVC.Admin.Actions.Menu());
return View(MVC.Home.Views.Partials.Menu);
}
Tuttavia, il codice in ExecuteResult nella classe TransferResult non sembra funzionare con l'attuale versione di anteprima di MVC 4. Mi dà il seguente errore (indicando la linea "httpHandler.ProcessRequest"):
'HttpContext.SetSessionStateBehavior' can only be invoked before
'HttpApplication.AcquireRequestState' event is raised.
Qualche idea su come risolvere questo problema?
PS: Mi rendo conto che potrei ottenere lo stesso utilizzando una semplice estensione HtmlHelper, che è quello che sto attualmente utilizzando come soluzione alternativa. Tuttavia, ho molti altri scenari in cui questo metodo mi ha permesso di mescolare e riutilizzare le azioni, e odio rinunciare a questa flessibilità quando mi trasferisco su MVC 4.
Si dovrebbe mettere questo metodo in una base di classe' Controller', non in tutti i controller di – SLaks
@SLaks Questo sembra essere un micro-ottimizzazione, dato che il codice è generato da T4MVC ed è solo un one-liner. Inoltre non fa nulla per aiutare a risolvere il problema;) –
Deve essere un giorno lento, non può nemmeno ottenere un upvote: o) –