Вопрос о RouteData и ValueProvider на Asp.net MVC3 - PullRequest
2 голосов
/ 09 августа 2011

У меня есть одно сомнение

Чтобы использовать это предложение: filterContext.RouteData.Values["MyRouteValue"] ключ должен быть объявлен в маршруте в таблице маршрутов, верно?

Я имею в виду, должно быть в таблице маршрутов что-то вроде: {MyRouteValue}/

Если у меня есть запрос типа / Controller / Action? MyRouteValue = XXXXXXX, я получаю нулевое значение от filterContext.RouteData.Values["MyRouteValue"].Это означает, что если я хочу получить значение, мне нужно использовать filterContext.Controller.ValueProvider.GetValue ("publishingUrlTitle"). AttemptedValue istead?

Заранее спасибо.

С уважением.

Хосе.

Ответы [ 2 ]

6 голосов
/ 09 августа 2011

Чтобы использовать это предложение: filterContext.RouteData.Values ​​["MyRouteValue"] ключ должен быть объявлен в маршруте в таблице маршрутов, верно?

Да.

Если у меня есть запрос типа / Controller / Action? MyRouteValue = XXXXXXX im получение нулевого значения от filterContext.RouteData.Values ​​["MyRouteValue"]. это означает, что если я хочу получить значение, я должен использовать filterContext.Controller.ValueProvider.GetValue ( "publicationUrlTitle"). AttemptedValue istead

Да, используйте ValueProvider или прочитайте его из filterContext.HttpContext.Request["MyRouteValue"]. Преимущество использования ValueProvider заключается в том, что он просматривается во многих местах: данные маршрута, параметры строки запроса GET, параметры POST, поставщики пользовательских значений, такие как поставщик значений JSON в ASP.NET MVC 3, ...

Просто будьте осторожны при обращении к свойству .AttemptedValue, так как вы можете получить NRE, если MyRouteValue нигде не найти.

0 голосов
/ 21 июля 2013

Для отладки всех routeValues ​​я создал фильтр, который копирует все параметры действия из метода действия в таблицу значений routedata:

public class CopyActionParametersToRouteData : ActionFilterAttribute {
    public override void OnActionExecuting(ActionExecutingContext filterContext) {
        var controller = filterContext.Controller as Controller;
        if (controller == null)
            return;

        foreach (var actionParameter in filterContext.ActionParameters) {
            if (controller.RouteData.Values.ContainsKey(actionParameter.Key))
                continue;
            controller.RouteData.Values.Add(actionParameter.Key, actionParameter.Value);
        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...