Параметр действия .NET MVC объекта типа. - PullRequest
4 голосов
/ 30 января 2012

Если у меня простой контроллер, маршрутизируемый следующим образом:

context.MapRoute(
            "Default",
            "{controller}/{action}",
            new { controller = "Base", action = "Foo"}
        );

А контроллер Foo действует следующим образом:

[HttpPost]
public ActionResult Foo(object bar) { ... }

Как будет bar быть связанным? Я отладил и вижу, что это string, но я не уверен, что он всегда будет маршализован в строку.

По сути, я хочу, чтобы метод принимал bool, List<int> и int. Я могу отправить параметр типа и сделать привязку модели самостоятельно из поста. (Сообщение является формой сообщения).

Вот мои текущие сообщения &bar=False или &bar=23 или &bar[0]=24&bar[1]=22.

Я знаю, что могу посмотреть на пост в методе действий Foo, но я хочу получить информацию о том, как лучше всего справиться с этим в MVC3

Ответы [ 2 ]

3 голосов
/ 30 января 2012

В этом случае я бы, вероятно, создал пользовательский ModelBinder:

http://buildstarted.com/2010/09/12/custom-model-binders-in-mvc-3-with-imodelbinder/

тогда, возможно, используйте динамический объект для учета нескольких типов. Смотри здесь

MVC3 ModelBinder для DynamicObject

3 голосов
/ 30 января 2012

Пользовательская привязка модели - это одна из опций, которую вы можете применить к своему параметру.Ваш компоновщик может лучше всего угадать тип (если MVC не получит лучшую подсказку из контекста, он просто примет строку).Однако это не даст вам строго типизированных параметров;Вы должны были бы проверить и бросить.И хотя в этом нет ничего особенного ...

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

[ActionName("SomeMethod"), MatchesParam("value", typeof(int))]
public ActionResult SomeMethodInt(int value)
{
   // etc
}

[ActionName("SomeMethod"), MatchesParam("value", typeof(bool))]
public ActionResult SomeMethodBool(bool value)
{
   // etc
}

[ActionName("SomeMethod"), MatchesParam("value", typeof(List<int>))]
public ActionResult SomeMethodList(List<int> value)
{
   // etc
}


public class MatchesParamAttribute : ActionMethodSelectorAttribute
{
     public string Name { get; private set; }
     public Type Type { get; private set; }

     public MatchesParamAttribute(string name, Type type)
     { Name = name; Type = type; }

     public override bool IsValidForRequest(ControllerContext context, MethodInfo info)
     {
             var val = context.Request[Name];

              if (val == null) return false;

             // test type conversion here; if you can convert val to this.Type, return true;

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