gpt4 book ai didi

asp.net-mvc-3 - 模型绑定(bind)逗号分隔的查询字符串参数

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

如何绑定(bind)以逗号分隔值的查询字符串参数

http://localhost/Action?ids=4783,5063,5305

到需要列表的 Controller 操作?

public ActionResult Action(List<long> ids)
{
return View();
}

注意! Controller 操作中的 ids 必须是一个列表(或基于 IEnumerable 的内容),因此 string ids 不被接受作为答案因为这些参数会传递给许多操作,并且将字符串解析为数组会增加不必要的噪音。

最佳答案

这是我在 archil 的答案中使用的 Nathan Taylor 解决方案的改进版本。

  1. Nathan 的 Binder 只能绑定(bind)复杂模型的子属性,而我的也可以绑定(bind)单独的 Controller 参数。
  2. 我的 Binder 还可以通过返回一个空参数来正确处理空参数数组或 IEnumerable 的实际空实例。

要连接它,您可以将其附加到单个 Controller 参数:

[ModelBinder(typeof(CommaSeparatedModelBinder))]

…或者在global.asax.cs的Application_Start中将其设置为全局默认绑定(bind)器:

ModelBinders.Binders.DefaultBinder = new CommaSeparatedModelBinder();

在第二种情况下,它将尝试处理所有 IEnumerables 并回退到 ASP.NET MVC 标准实现来处理其他所有事情。

看哪:

public class CommaSeparatedModelBinder : DefaultModelBinder
{
private static readonly MethodInfo ToArrayMethod = typeof(Enumerable).GetMethod("ToArray");

public override object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext)
{
return BindCsv(bindingContext.ModelType, bindingContext.ModelName, bindingContext)
?? base.BindModel(controllerContext, bindingContext);
}

protected override object GetPropertyValue(ControllerContext controllerContext, ModelBindingContext bindingContext, System.ComponentModel.PropertyDescriptor propertyDescriptor, IModelBinder propertyBinder)
{
return BindCsv(propertyDescriptor.PropertyType, propertyDescriptor.Name, bindingContext)
?? base.GetPropertyValue(controllerContext, bindingContext, propertyDescriptor, propertyBinder);
}

private object BindCsv(Type type, string name, ModelBindingContext bindingContext)
{
if (type.GetInterface(typeof(IEnumerable).Name) != null)
{
var actualValue = bindingContext.ValueProvider.GetValue(name);

if (actualValue != null)
{
var valueType = type.GetElementType() ?? type.GetGenericArguments().FirstOrDefault();

if (valueType != null && valueType.GetInterface(typeof(IConvertible).Name) != null)
{
var list = (IList)Activator.CreateInstance(typeof(List<>).MakeGenericType(valueType));

foreach (var splitValue in actualValue.AttemptedValue.Split(new[] { ',' }))
{
if(!String.IsNullOrWhiteSpace(splitValue))
list.Add(Convert.ChangeType(splitValue, valueType));
}

if (type.IsArray)
return ToArrayMethod.MakeGenericMethod(valueType).Invoke(this, new[] { list });
else
return list;
}
}
}

return null;
}
}

关于asp.net-mvc-3 - 模型绑定(bind)逗号分隔的查询字符串参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9584573/

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