Как определить, существует ли представление в ASP.NET MVC 3? - PullRequest
4 голосов
/ 22 июля 2011

Я реализую новое приложение ASP.NET MVC 3, которое будет использовать форму динамической маршрутизации, чтобы определить, какое представление следует возвращать из общего действия контроллера. Я хотел бы иметь представление по умолчанию, которое отображается, если в динамическом местоположении нет представления.

Думайте об этом как о навигации по древовидной структуре. В корневой папке контроллеров находится только один TreeController. У него есть метод действия Browse, который принимает путь узла для просмотра. Каждый узел может иметь собственное представление, поэтому мне нужно сначала попытаться найти это представление и вернуть его из метода действия, например:

public ViewResult Browse(String path)
{
    var model = ...;

    return View(path, model);
}

Итак, если я перейду к «MySite / Tree / A / B / C», то я ожидаю найти представление в «\ Views \ Tree \ A \ B \ C.aspx».

Однако, если пользовательский вид отсутствует, мне нужно перейти к стандартному / стандартному представлению (например, \ Views \ Tree \ Browse.aspx).

Поскольку это относится только к этому методу действия, я не считаю, что мне следует обрабатывать ошибки NotFound, которые могут возникнуть из-за других обстоятельств. И я не ищу динамическую маршрутизацию, как описано в других сообщениях, потому что путь к контроллеру фиксирован.

Ответы [ 2 ]

1 голос
/ 22 июля 2011

Контроллеры не должны знать о физических представлениях.

Это делается путем написания пользовательского механизма представления, например:

public class MyViewEngine: WebFormViewEngine
{
    public MyViewEngine() 
    {
        ViewLocationFormats = ViewLocationFormats.Concat(
            new [] {"~/Views/{1}/Browse.aspx""}).ToArray();
        // similarly for AreaViewLocationFormats, etc., if needed
    }
}

См. Исходный код, например, WebFormViewEngine для получения подробной информации..

Если вам нужно сделать это условно (только для нескольких действий), вы можете переопределить FindView в этом типе и посмотреть значения маршрута.

Очевидно, что если вы используете Razor, а затем измените его.

Затем, в Global.asax.cs, используйте его:

private void Application_Start(object sender, EventArgs e)
{
    // stuff
    ViewEngines.Engines.Add(new MyViewEngine());
0 голосов
/ 09 декабря 2014

В действии контроллера это, кажется, работает:

var fullPath = string.Format("~/Views/CustomStuff/{0}.cshtml", viewname);
var mappedPath = Server.MapPath(fullPath);
if( !System.IO.File.Exists(mappedPath) ) return View("Default");

else return View(viewname);

(примечание: без предварительной компиляции представлений)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...