Определить значения маршрута в представлении - PullRequest
1 голос
/ 16 декабря 2010

Можно ли определить значение маршрута в представлении?

Например, /pages/create/1, и я хочу проверить, есть ли 1?

По сути, я хочу визуализировать другое частичное представление на основе этого значения, хотя я вполне уверен, что это, вероятно, не лучший способ добиться того, чего я пытаюсь достичь.

В дополнение к этому, вместо того, чтобы делать вышеупомянутое, могу ли я иметь возможность изменить то, какие частичные представления отображаются в представлении на основе значения из моего контроллера?

Ответы [ 3 ]

5 голосов
/ 16 декабря 2010
ViewContext.RouteData.Values["whatever"]
1 голос
/ 16 декабря 2010

Другие ответы верны, но я подумал, что я отвечу на ваше последнее предложение:

В дополнение к этому, вместо того, чтобы делать вышеупомянутое, могу ли я иметь возможность изменить, какие частичные представления отображаются в представлении на основе значения из моего контроллера?

Ну, частичные представления визуализируются в самом представлении (если не вызывать из JavaScript и не привязывать непосредственно к DOM) со следующим кодом:

<%: Html.RenderPartial("SomePartial") %>

Таким образом, чтобы предотвратить "суп из кода" (если операторы) в вашем представлении, вы используете помощник HTML, который вызывает RenderPartial после проверки ViewContext:

public static string RenderCustomPartial(this HtmlHelper helper, RouteData rd)
{
   string partialName;

   if (rd.Values["SomeParam"] == 1)
     partialName = "PartialOneName";
   else
     partialName = "PartialTwoName";

   return helper.RenderPartial(partialName);
}

А затем в виде:

<%: Html.RenderCustomPartial(ViewContext.RouteData) %>

Вы могли бы внести некоторые изменения в вышеперечисленное - например, получить доступ к данным маршрута непосредственно в расширении, пройти через модель для связывания в парциальном и т. Д., - но вы поняли идею.

В качестве альтернативы вы можете сделать приведенный выше оператор IF в вашем контроллере и вставить частичное имя представления в ViewData, а затем использовать его в обычном вызове RenderPartial в вашем View.

Все, что плавает на вашей лодке. :)

1 голос
/ 16 декабря 2010

Вы можете проверить RouteData объект через ViewPage.ViewContext.RouteData. Затем проверьте значения, используя что-то вроде

string areaname = routeData.Values["area"] as string;
string controllername = routeData.Values["controller"] as string;
string actionname = routeData.Values["action"] as string;
string id = routeData.Values["id"] as string;

Если вы обнаружите, что вместо этого хотите проверить эти значения в контроллере, вы можете получить к ним доступ с помощью ControllerBase.ControllerContext.RouteData. Нечто подобное применимо и к фильтрам действий и т. Д.

...