Обработка переменных MVC2 с дефисами в их имени - PullRequest
6 голосов
/ 06 мая 2010

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

Пример URL, который я хочу обработать, таков:

http://localhost/app/Person/List?First-Name=Bob&My-Age=3

с этим контроллером:

public ActionResult List(string First_Name, int My_Age)
{
    {...}
}

Повторим, я не могу изменить сгенерированную строку запроса, поэтому мне нужно каким-то образом поддерживать ее с моим контроллером. Но как?

Для справки ниже приведен пользовательский RouteHandler, который используется для обработки подчеркиваний в именах контроллеров и именах действий из SO-вопроса, на который я ссылался выше, что мы могли бы изменить, чтобы выполнить то, что я хочу:

public class HyphenatedRouteHandler : MvcRouteHandler
{
    protected override IHttpHandler  GetHttpHandler(RequestContext requestContext)
    {
        requestContext.RouteData.Values["controller"] = requestContext.RouteData.Values["controller"].ToString().Replace("-", "_");
        requestContext.RouteData.Values["action"] = requestContext.RouteData.Values["action"].ToString().Replace("-", "_");
        return base.GetHttpHandler(requestContext);
    }
}

Ответы [ 2 ]

7 голосов
/ 06 мая 2010

Вы пробовали [Bind(Prefix="First-name")]? Это может сработать ...

Один из способов - связка с пользовательской моделью. Другой способ был бы с фильтром действий. Используйте подшивку модели, если вы хотите сделать это для определенного типа . Используйте фильтр действий, если вы хотите сделать это на конкретном действии или контроллере. Так что для последнего метода вы можете сделать что-то вроде:

    public override void OnActionExecuting(ActionExecutingContext filterContext)
    {
        var keys = filterContext.HttpContext.Request.QueryString.AllKeys.Where(k => k.Contains('-'));
        foreach(var k in keys)
        {
            filterContext.ActionParameters.Add(
                new KeyValuePair<string, object>(
                    k.Replace('-', '_'), filterContext.HttpContext.Request.QueryString[k]));
        }
        base.OnActionExecuting(filterContext);
    }
1 голос
/ 19 июня 2012

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

string First_Name = Request["First-Name"];

Возможно, вы захотите проверить NUlls, если параметра там нет, но это разобрало его для меня. Вы также можете включить необязательный параметр для ActionResult для целей тестирования и т. Д.

...