MVC模型绑定到集合不以0索引开头的集合

Flo*_*eft 12 validation asp.net-mvc model-binding asp.net-mvc-3

我正在尝试对集合中项目的属性执行远程验证.验证在集合的第一项上正常工作.对验证方法的http请求如下所示:

/Validation/IsImeiAvailable?ImeiGadgets[0].ImeiNumber=123456789012345
Run Code Online (Sandbox Code Playgroud)

但是,在下面的url看起来像的第二个项目上,验证不起作用

/Validation/IsImeiAvailable?ImeiGadgets[1].ImeiNumber=123456789012345
Run Code Online (Sandbox Code Playgroud)

现在我很确定这个的原因,就是绑定不会对一个不以零索引开头的集合起作用.

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

public JsonResult IsImeiAvailable([Bind(Prefix = "ImeiGadgets")] Models.ViewModels.ImeiGadget[] imeiGadget)
Run Code Online (Sandbox Code Playgroud)

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

无论如何我可以解决这个问题,而不仅仅是将它绑定为普通的旧查询字符串.

谢谢

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

string imeiNumber = Request.Url.AbsoluteUri.Substring(Request.Url.AbsoluteUri.IndexOf("=")+1);
Run Code Online (Sandbox Code Playgroud)

编辑:这是我的ImeiGadget类:

public class ImeiGadget
{
    public int Id { get; set; }

    [Remote("IsImeiAvailable", "Validation")]
    [Required(ErrorMessage = "Please provide the IMEI Number for your Phone")]
    [RegularExpression(@"(\D*\d){15,17}", ErrorMessage = "An IMEI number must contain between 15 & 17 digits")]
    public string ImeiNumber { get; set; }
    public string Make { get; set; }
    public string Model { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

Dar*_*rov 8

你可以写一个自定义模型绑定器:

public class ImeiNumberModelBinder : IModelBinder
{
    public object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext)
    {
        var modelName = bindingContext.ModelName;
        var request = controllerContext.HttpContext.Request;
        var paramName = request
            .Params
            .Keys
            .Cast<string>()
            .FirstOrDefault(
                x => x.EndsWith(modelName, StringComparison.OrdinalIgnoreCase)
            );

        if (!string.IsNullOrEmpty(paramName))
        {
            return bindingContext
                .ValueProvider
                .GetValue(request[paramName])
                .AttemptedValue;
        }

        return null;
    }
}
Run Code Online (Sandbox Code Playgroud)

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

public ActionResult IsImeiAvailable(
    [ModelBinder(typeof(ImeiNumberModelBinder))] string imeiNumber
)
{
    return Json(!string.IsNullOrEmpty(imeiNumber), JsonRequestBehavior.AllowGet);
}
Run Code Online (Sandbox Code Playgroud)

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