ASP.NET MVC - текущая папка просмотра - PullRequest
1 голос
/ 09 июля 2009

Кто-нибудь знает, как получить текущую папку вызываемого представления? Я также использую AreasLib, поэтому мне нужно получить его динамически, без префиксов путей. Так, например, если я сделаю http://localhost/myarea/mycontroller/myaction, это даст мне путь Project/Areas/myarea/Views/mysubsystem. Так что да, это должна быть папка, в которой находится view .

EDIT : Это либо так, либо редактирование MvcSiteMap исходного кода для работы с AreasLib . На самом деле я не вооружен навыками или временем, которое важнее всего.

FINAL

Это не красиво, но у меня не было выбора вообще. Я использую частичные представления для визуализации компонентов меню, используя следующий помощник, чтобы найти правильный. Я не имею дело с отсутствующими файлами menu.ascx в этой версии, но предполагается, что они всегда будут.

using System;
using System.Web;
using System.Runtime.CompilerServices;
using System.Web.Mvc;

namespace Intranet.Helpers
{
  public static class StaticMenuHelper
  {
    public static string StaticMenu(this HtmlHelper helper, string area, string controller)
    {
      if (area.Equals("root"))
      {
        return "/Views/" + controller + "/menu.ascx";
      }
      else
      {
        return "/Areas/" + area + "/Views/" + controller + "/menu.ascx";
      }
    }
  }
}

и следующее по моему Site.Master.

<div id="menu">
    <% Html.RenderPartial(Html.StaticMenu(ViewContext.RouteData.Values["area"].ToString(), ViewContext.RouteData.Values["controller"].ToString())); %>
</div>

Пока MvcSiteMap не превратится во что-то, что может иметь дело с AreasLib , тогда мне придется использовать это. У меня действительно действительно нет времени, чтобы изменить эту библиотеку.

Спасибо за помощь.

Ответы [ 2 ]

2 голосов
/ 09 июля 2009

Что ж, мне кажется, что если вы вызываете представление из определенного контроллера, было бы довольно просто построить путь из того, что вы уже знаете. Если вам это нужно в представлении, вы можете просто передать его, используя запись ViewData.

Итак, если вы делаете

http://localhost/myarea/mycontroller/myaction

тогда контроллер, которому вы звоните, уже знает myarea, mycontroller и myaction. Я предполагаю, что вы создаете либо частичное представление, либо Html вспомогательный метод для обработки меню, поэтому при рендеринге представления передайте myarea, mycontroller и myaction в представление как переменные ViewData. По вашему мнению, передайте эти переменные в ваш частичный вид или метод Html-помощника.

Или вы можете построить свой путь из myarea, mycontroller и myaction и вместо этого протолкнуть весь путь в ваше представление.

Использование:

<%= Html.Menu(ViewData["Area"], ViewData["Controller"], ViewData["Action"]) %>

Пример функции для расчета пути:

string GetPath(string area, string controller, string action)
{
    return "/project/areas/" + area + "/" + controller + "/" + action 
}

РЕДАКТИРОВАТЬ: Как указал Крейг Штунц, вы можете получить значения маршрута в представлении (через ViewContext) без необходимости сначала помещать их в ViewData. Это означает, что вы можете построить свой путь непосредственно с помощью метода расширения меню, при условии, что вы можете получить area таким же образом. Я не уверен, поддерживает ли Фил материал или нет.

ViewContext.RouteData.Values["controller"].ToString() 
ViewContext.RouteData.Values["action"].ToString() 
1 голос
/ 09 июля 2009

Разве это не то же самое, что пространство имен представления? Это достаточно легко проверить с самого взгляда.

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