2011-05-30 10 views
5

Filtre Değiştirme. Mobil bir görünüme sahip olmak istediğim işlemlere uygulayarak MVC filtreleri kullanarak bunu yapmak istediğime karar verdim.bir mobil tarayıcı kullanıyorsanız bir ASP.NET MVC görünümü farklı bir görünüme kullanıcıyı yönlendirmek için istediğiniz

Bu yeniden yönlendirmenin OnActionExecuted'de gerçekleşmesi gerektiğine inanıyorum, ancak filterContext görünümü hakkında bilgi içermiyor, ancak OnResultExecuted içinde ancak bu kez görünümü değiştirmek için çok geç olduğuna inanıyorum.

nasıl görünüm adı yakalamak ve ViewResult değiştirebilirim?

Bu İdam sonuçta var ve ne istiyorum Eylem çalışma Yürütülen olması budur.

public class MobilePageFilter : ActionFilterAttribute 
{ 
    public override void OnResultExecuted(ResultExecutedContext filterContext) 
    { 
     if(filterContext.Result is ViewResult) 
     { 
      if (isMobileSite(filterContext.HttpContext.Session[SetMobile.SESSION_USE_MOBILE])) 
      { 
       ViewResult viewResult = (ViewResult)filterContext.Result; 

       string viewName = viewResult.ViewName; 
       filterContext.Result = new ViewResult 
       { 
        ViewName = "Mobile/" + viewName, 
        ViewData = viewResult.ViewData, 
        TempData = viewResult.TempData 
       }; 
      } 
     } 

     base.OnResultExecuted(filterContext); 
    } 
} 
+0

Global.cs – zsong

cevap

4

Sana soran yerine eylem filtreleri kullanarak hangi başarmak için daha iyi bir alternatif açıklar following blog post öneriyoruz.

public class AuthoriseSiteAccessAttribute : ActionFilterAttribute 
{ 
    public override void OnActionExecuting(ActionExecutingContext filterContext) 
    { 
     base.OnActionExecuting(filterContext); 

     // Perform your condition, or straight result assignment here. 
     // For me I had to test the existance of a cookie. 
     if (yourConditionHere) 
      filterContext.Result = new SiteAccessDeniedResult(); 
    } 

} 

public class SiteAccessDeniedResult : ViewResult 
{ 
    public SiteAccessDeniedResult() 
    { 
     ViewName = "~/Views/SiteAccess/Login.cshtml"; 
    } 
} 
:
+0

teşekkür, tamamen farklı bir çözüm rota kuralları ekleme ama harika çalışıyor. – Sam

3

Bu

yaptığım sona erdi ve yeniden kullanılabilir öznitelik içine sarılmış ve yönlendirme (veya istediğiniz sonucu ne olursa olsun uygulayarak) gereksinimlere dayalı iken çok şey, orijinal URL'yi korur budur

Sonra sadece (benim durumumda) yetkilendirme erişimini uygulamak veya bir BaseController eklemek istediğiniz denetleyicileri için öznitelik [SiteAccessAuthorise] ekleyin. emin olun olsa denetleyicisi altında yatan olsa özelliği olmayan veya sonsuz bir döngüye olacağım var yönlendiriyorsunuz eylem!

İlgili konular