Как получить MVC для просмотра в виде вложенной папки - PullRequest
9 голосов
/ 06 марта 2012

Мои знания MVC и Razor довольно просты, поэтому я надеюсь, что это что-то довольно простое. Обычно у меня Controllers как обычно, но папка Views имеет вложенную структуру. Например, вместо:

Views -> Index.cshtml

Это как

Views -> BrandName -> Index.cshtml

Я создал собственный помощник, чтобы обойти это, но я не уверен, как он будет работать с URL-адресами строк запроса? В качестве примера приведем контроллер:

    private DataService ds = new DataService();

    //
    // GET: /Collections/

    public ActionResult Index()
    {
        return View();
    }


    //
    // GET: /Collections/Collection?id=1
    public ActionResult Collection(int id)
    {
        var collectionModel = ds.GetCollection(id);
        return View(collectionModel);
    }

Но как мне заставить ActionResult Collection взглянуть на:

Views -> Brand2 -> Collection.cshtml

Вот метод обхода, который я использовал:

public static string ResolvePath(string pageName)
    {
        string path = String.Empty;
        //AppSetting Key=Brand
        string brand = ConfigurationManager.AppSettings["Brand"];

        if (String.IsNullOrWhiteSpace(brand))
            path = "~/Views/Shared/Error.cshtml"; //Key [Brand] was not specified
        else
            path = String.Format("~/Views/{0}/{1}", brand, pageName);

        return path;
    }

Ответы [ 2 ]

12 голосов
/ 06 марта 2012

Используйте следующее

public ActionResult Collection(int id)
{
    var collectionModel = ds.GetCollection(id);
    return View("/Brand2/Collection", collectionModel);
}

Приведенный выше код будет искать следующие представления.

~/Views/Brand2/Collection.aspx
~/Views/Brand2/Collection.ascx
~/Views/Shared/Brand2/Collection.aspx
~/Views/Shared/Brand2/Collection.ascx
~/Views/Brand2/Collection.cshtml
~/Views/Brand2/Collection.vbhtml
~/Views/Shared/Brand2/Collection.cshtml
~/Views/Shared/Brand2/Collection.vbhtml

или, чтобы быть более прямым

public ActionResult Collection(int id)
    {
        var collectionModel = ds.GetCollection(id);
        return View("~/Brand2/Collection.cshtml", collectionModel);
    }

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

0 голосов
/ 14 сентября 2018

Вы можете сделать это при запуске приложения, добавив пути, которые механизм просмотра должен проверить следующим образом.

           RazorViewEngine razorEngine = ViewEngines.Engines.OfType<RazorViewEngine>()
          .FirstOrDefault();

            List<string> viewLocationFormats = new List<string>();
            newPartialViewFormats.Add("~/Views/Shared/MyDirectory/{0}.cshtml");
            //add any other directories you want to check as well

            razorEngine.ViewLocationFormats =
                razorEngine.ViewLocationFormats.Union(viewLocationFormats).ToArray();

Для частичных видов вы можете сделать то же самое, но вместо свойства razorEngine.PartialViewLocationFormats.

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