Asp.net-Mvc

MVC 模型綁定到集合不以 0 索引開頭的集合

  • February 27, 2020

我正在嘗試對集合中項目的屬性執行遠端驗證。驗證適用於集合的第一項。驗證方法的 http 請求如下所示:

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

但是,在 url 如下所示的第二個項目中,驗證不起作用

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

現在我很確定這樣做的原因是綁定不會在不以零索引開頭的集合上工作。

我的驗證方法具有如下簽名:

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

因為我在集合中傳遞一個項目,所以我必須像這樣綁定,但我真正傳遞的只是一個值。

除了將它綁定為普通的舊查詢字元串之外,我是否可以處理這個問題。

謝謝

編輯:這是獲取 Imei 變數的快速修復,但我寧願使用模型綁定:

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

編輯:這是我的 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; }
}

您可以編寫自定義模型綁定器:

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;
   }
}

然後將其應用於控制器操作:

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

現在該ImeiGadgets[xxx]部分將從查詢字元串中被忽略。

引用自:https://stackoverflow.com/questions/10760035