Обработка переменных MVC2 с дефисами в их имени

Я работаю с некоторым сторонним программным обеспечением, которое создает параметры querystring с дефисами в их именах. Я смотрел на это так вопрос и кажется, что их решение очень близко к тому, что мне нужно, но я слишком невежественен для базового материала 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 ответов


ты пробовал [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);
    }

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

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

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