asp.net-mvc – MVC模型绑定到集合不以0索引开头的集合

前端之家收集整理的这篇文章主要介绍了asp.net-mvc – MVC模型绑定到集合不以0索引开头的集合前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我正在尝试对集合中项目的属性执行远程验证.验证在集合的第一个项目上正常工作.验证方法的http请求如下所示:
  1. /Validation/IsImeiAvailable?ImeiGadgets[0].ImeiNumber=123456789012345

然而,在URL的第二个项目中,验证不起作用

  1. /Validation/IsImeiAvailable?ImeiGadgets[1].ImeiNumber=123456789012345

现在我很确定的原因是,绑定不适用于不以零索引开头的集合.

我的验证方法有如下的签名:

  1. public JsonResult IsImeiAvailable([Bind(Prefix = "ImeiGadgets")] Models.viewmodels.ImeiGadget[] imeiGadget)

因为我在一个集合中传递一个项目,所以我必须绑定这个东西,但我真正传递的只是一个值.

有没有办法我可以处理这个,而不是把它绑定成一个纯旧的查询字符串.

谢谢

编辑:这是获取Imei变量的快速修复,但我宁愿使用模型绑定:

  1. string imeiNumber = Request.Url.AbsoluteUri.Substring(Request.Url.AbsoluteUri.IndexOf("=")+1);

编辑:这是我的ImeiGadget类:

  1. public class ImeiGadget
  2. {
  3. public int Id { get; set; }
  4.  
  5. [Remote("IsImeiAvailable","Validation")]
  6. [required(ErrorMessage = "Please provide the IMEI Number for your Phone")]
  7. [RegularExpression(@"(\D*\d){15,17}",ErrorMessage = "An IMEI number must contain between 15 & 17 digits")]
  8. public string ImeiNumber { get; set; }
  9. public string Make { get; set; }
  10. public string Model { get; set; }
  11. }

解决方法

您可以编写一个自定义模型binder:
  1. public class ImeiNumberModelBinder : IModelBinder
  2. {
  3. public object BindModel(ControllerContext controllerContext,ModelBindingContext bindingContext)
  4. {
  5. var modelName = bindingContext.ModelName;
  6. var request = controllerContext.HttpContext.Request;
  7. var paramName = request
  8. .Params
  9. .Keys
  10. .Cast<string>()
  11. .FirstOrDefault(
  12. x => x.EndsWith(modelName,StringComparison.OrdinalIgnoreCase)
  13. );
  14.  
  15. if (!string.IsNullOrEmpty(paramName))
  16. {
  17. return bindingContext
  18. .ValueProvider
  19. .GetValue(request[paramName])
  20. .AttemptedValue;
  21. }
  22.  
  23. return null;
  24. }
  25. }

然后将其应用于控制器操作:

  1. public ActionResult IsImeiAvailable(
  2. [ModelBinder(typeof(ImeiNumberModelBinder))] string imeiNumber
  3. )
  4. {
  5. return Json(!string.IsNullOrEmpty(imeiNumber),JsonRequestBehavior.AllowGet);
  6. }

现在,ImeiGadgets [xxx]部分将从查询字符串中被忽略.

猜你在找的asp.Net相关文章