Способы связать параметр с другим именем в ASP.NET MVC? - PullRequest
2 голосов
/ 03 июня 2009

Я продолжаю сталкиваться со сценариями, в которых я хотел бы предоставить немного более интуитивное или «правильно сформированное» имя параметра для методов действия, но с поведением по умолчанию это оказывается довольно болезненным. Например, предположим, что у меня есть параметр действия, такой как GetWidget (int id). Если я хочу, чтобы это был GetWidget (int widgetId), я должен добавить новый маршрут. Хуже, когда вы используете библиотеку, такую ​​как jqGrid, которая использует ужасные имена для своих параметров строки запроса: GetWidgets (int? Nodeid, int? N_level). Вместо этого я хотел бы иметь GetWidgets (int? ParentId, int? Level) или что-то подобное.

Итак, есть что-то простое, что я пропускаю? Похоже, что очень просто сказать MVC, что мой параметр parentId должен быть связан со значением «nodeid» в запросе. Я думал о том, чтобы написать собственный фильтр действий, чтобы сделать это, но это кажется настолько очевидным, что я не могу поверить, что он не поддерживается "из коробки".

Ответы [ 3 ]

4 голосов
/ 07 июня 2011

В соответствии с ответом Рони используйте связующее для пользовательской модели. Вот пример:

public class BindToAliasAttribute : CustomModelBinderAttribute
{
    private readonly string parameterAlias;

    public BindToAliasAttribute(string parameterAlias)
    {
        this.parameterAlias = parameterAlias;
    }

    public override IModelBinder GetBinder()
    {
        return new ParameterWithAliasModelBinder(parameterAlias);
    }
}

public class ParameterWithAliasModelBinder : IModelBinder
{
    private readonly string parameterAlias;

    public ParameterWithAliasModelBinder(string parameterAlias)
    {
        this.parameterAlias = parameterAlias;
    }

    object IModelBinder.BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext)
    {
        return controllerContext.RouteData.Values[parameterAlias];
    }
}

public class UserController : Controller
{
    [HttpGet]
    public ActionResult Show( [BindToAlias("id")] string username)
    {
        ...
    }
}
3 голосов
/ 03 июня 2009

Если вы используете именованные параметры в URL, вы можете указать конкретное имя для параметра в методе вашего контроллера, например так:

http://mydomain.com/mycontroller/getwidget?parentid=1&level=2

... и вам не придется сопоставлять маршруты по параметрам.

1 голос
/ 03 июня 2009

используйте свой собственный механизм связывания моделей, который реализует IModelBinder

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