asp.net-mvc-2 - 将/action/1,2,3 绑定(bind)到List<int>

标签 asp.net-mvc-2 reflection rest routes

在我的 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/

相关文章:

java - 确定一个类是否在 Java 中实现了一个接口(interface)

使用反射调用 PumpEvents 时出现 java.lang.illegalArgumentException

c# - 基于属性的项目之间的反射(reflection)

python - django嵌套查询或连接两个表

c# - 查看模型 Asp.Net MVC

asp.net - 默认模型绑定(bind)器不绑定(bind)我的模型类

c# - CaSTLe Windsor Inversion of Control (IoC) : using the Web. 配置解决依赖关系

node.js - 从后端发送一个Excel文件到前端,并在前端下载

java - Spring 映射处理程序未将我的curl 请求映射到方法

javascript - ASP.NET MVC 编辑器用于自定义 javascript