在我的 API 中,我希望有类似 GET /api/v1/widgets/1,2,3
的路线和GET /api/v1/widgets/best-widget,major-widget,bob-the-widget
public class WidgetsController : MyApiController
{
public ActionResult Show(IEnumerable<int> ids)
{
}
public ActionResult Show(IEnumerable<string> names)
{
}
}
我已经设置了前往行动的路线,但我不知道如何转向 1,2,3
进入new List<int>(){1, 2, 3}
等等。当然,我可以直接取 string
并在我的操作中解析它,但我想避免走这条路。
我想到的一件事是在 OnActionExecuting
中放入一些内容方法,但后来我不确定到底要放什么(显然,我可以将一些东西组合在一起,但我正在尝试编写一些可重用的东西。)
我的主要问题是如何知道我是否需要做任何事情(有时上游的 ValueProviders 会弄清楚所有事情),以及如何处理确定要转换的类型(例如,我怎么知道在这种情况下,我需要转到整数集合或字符串集合,然后我该怎么做?)
顺便说一句,我有实现 ValueProvider
的想法以及,但在类似的问题上迷失了方向。
最佳答案
I can't figure out how to turn 1,2,3 into new List(){1, 2, 3} and so on.
为了避免污染需要接收此参数的每个 Controller 操作,我建议使用自定义模型绑定(bind)器:
public class IdsModelBinder : DefaultModelBinder
{
public override object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext)
{
var result = base.BindModel(controllerContext, bindingContext);
var ids = bindingContext.ValueProvider.GetValue("ids");
if (ids != null)
{
return ids.AttemptedValue
.Split(',')
.Select(id => int.Parse(id))
.ToList();
}
return result;
}
}
然后在 Application_Start
中注册模型绑定(bind)器:
ModelBinders.Binders.Add(typeof(IEnumerable<int>), new IdsModelBinder());
最后你的 Controller 操作可能看起来像这样(从我在你的问题中看到的,它已经看起来像这样了:-)):
public ActionResult Show(IEnumerable<int> ids)
{
...
}
自定义模型绑定(bind)器将负责解析 ids
将 token 路由到相应的IEnumerable<int>
值。
您可以对 IEnumerable<string>
执行相同的操作您只需删除 .Select
相应模型绑定(bind)器中的子句。
关于asp.net-mvc-2 - 将/action/1,2,3 绑定(bind)到List<int>,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5228144/