2013-06-13 6 views
1

У меня есть этот класс:Изменить путь мнение, на лету

public abstract class MyController : Controller 
{ 
    protected override void OnActionExecuting(ActionExecutingContext filterContext) 
    { 
     string viewPath = filterContext/*... .ViewPath*/; 
     viewPath = "Some new View Path"; 
    } 
} 

И я хотел бы, чтобы извлечь и заменить путь Исполнит вида по другим. Я попытался отлаживать контекст фильтра в веб-вызове, однако мне не удалось найти представление, которое будет отображаться.

Как это сделать?

ответ

5

От MSDN:

Controller.OnActionExecuting Method: Вызывается до того вызывается метод действия. На этом этапе ActionResult существует, так как Action еще не исполняется.

Лучше использовать OnResultExecuting вместо:

protected override void OnResultExecuting(ResultExecutingContext filterContext) 
{ 
    var viewResult = filterContext.Result as ViewResult; 

    if (viewResult != null) 
    { 
     var razorEngine = viewResult.ViewEngineCollection.OfType<RazorViewEngine>().Single(); 
     var viewName = !String.IsNullOrEmpty(viewResult.ViewName) ? viewResult.ViewName : filterContext.RouteData.Values["action"].ToString(); 
     var razorView = razorEngine.FindView(filterContext.Controller.ControllerContext, viewName, viewResult.MasterName, false).View as RazorView; 
     var currentPath = razorView.ViewPath; 
     var newPath = currentPath.Replace("..", "..."); 
     viewResult.View = new RazorView(filterContext.Controller.ControllerContext, newPath, razorView.LayoutPath, razorView.RunViewStartPages, razorView.ViewStartFileExtensions); 
    } 

    base.OnResultExecuting(filterContext); 
} 
+0

Название мнение ' "Index" или' "" 'и никогда не полный вид пути. Как получить строку типа '" ~/Views/Controller/ViewName "? – AgentFire

+0

Я соответствующим образом пересмотрел свой ответ. – haim770

+0

Свойство 'viewResult.View' всегда равно null, даже если имя вида изначально правильно. – AgentFire

Смежные вопросы