Skip to content

Instantly share code, notes, and snippets.

@mesuttalebi
Created December 12, 2014 13:28
Show Gist options
  • Save mesuttalebi/b8942000aae1477bb6f1 to your computer and use it in GitHub Desktop.
Save mesuttalebi/b8942000aae1477bb6f1 to your computer and use it in GitHub Desktop.
ViewSelector For Asp.net MVC - multiserve for one request in asp.net mvc- viewselector based browser
public class BrowserSpecificAttribute : ActionFilterAttribute
{
public override void OnResultExecuting(ResultExecutingContext filterContext)
{
var viewResult = filterContext.Result as ViewResult;
if (viewResult == null)
return;
// Figure out the view name
var context = filterContext.Controller.ControllerContext;
var viewName = viewResult.ViewName;
if (String.IsNullOrEmpty(viewName))
viewName = context.RouteData.GetRequiredString("action");
if (String.IsNullOrEmpty(viewName))
return;
// Resolve the view selector
var viewSelector = DependencyResolver.Current.GetService(typeof (IViewSelector)) as IViewSelector;
if (viewSelector == null)
viewSelector = new DefaultViewSelector();
// Figure out the browser name
var isMobileDevice = context.HttpContext.Request.Browser.IsMobileDevice;
var browserName = (isMobileDevice ?"mobile" :context.HttpContext.Request.Browser.Browser);
// Get the name of the browser-specific view to use
var newViewName = viewSelector.GetViewName(viewName, browserName);
if (String.IsNullOrEmpty(newViewName))
return;
// Is there such a view?
var result = System.Web.Mvc.ViewEngines.Engines.FindView(context, newViewName, viewResult.MasterName);
if (result.View != null)
viewResult.ViewName = newViewName;
}
}
public class DefaultViewSelector : IViewSelector
{
public String GetViewName(String viewName, String browserName)
{
return String.Format("{0}_{1}", viewName, browserName);
}
public String GetMasterName(String masterName, String browserName)
{
return String.Format("{0}_{1}", masterName, browserName);
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment