gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 06:32:32 25 4
gpt4 key购买 nike

在我的 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 Action 可能看起来像这样(从我在你的问题中可以看到它已经看起来像这样:-)):
public ActionResult Show(IEnumerable<int> ids)
{
...
}

并且自定义模型绑定(bind)器将负责解析 ids将 token 路由到相应的 IEnumerable<int>值(value)。

你可以对 IEnumerable<string> 做同样的事情您只需删除 .Select子句在相应的模型活页夹中。

关于asp.net-mvc-2 - 将/action/1,2,3 绑定(bind)到 List<int>,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5228144/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com