类型为object的.NET MVC Action参数

时间:2012-01-30 16:39:17

标签: c# asp.net-mvc

如果我有一个简单的控制器路由如下:

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

控制器Foo动作如下:

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

bar将如何受约束?我已调试并看到它是string,但我不确定它是否总是被编组为字符串。

基本上我想让方法接受boolList<int>int。我可以发送一个类型参数并从帖子中自己进行模型绑定。 (该帖子是一个表格帖子)。

以下是我当前的帖子&bar=False&bar=23&bar[0]=24&bar[1]=22

我知道我可以查看Foo动作方法中的帖子,但我想要一些关于在MVC3中处理这个的最佳方法的输入

2 个答案:

答案 0 :(得分:3)

自定义模型绑定器是一个选项,您可以将其应用于参数。你的绑定器可以最好地猜测类型(除非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;
     }
}

答案 1 :(得分:3)

在这种情况下,我可能会创建一个自定义的ModelBinder:

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

然后可能使用动态对象来允许多种类型。见这里

MVC3 ModelBinder for DynamicObject