我正在尝试使用RemoteAttribute使用JSON验证数据元素服务器端。我的数据字段是:
[Display(Name = "My Number")]
[Required]
[Remote("IsValidMyNumber","Home",ErrorMessage="Bummer")]
public string MyNumber { get; set; }
我的控制器是:
public JsonResult IsValidMyNumber(string MyNumber)
{
var test = services.ValidateMyNumber(MyNumber);
return Json(test,JsonRequestBehavior.AllowGet);
}
我的观点是:
<div class="editor-field">
@Html.EditorFor(model => model.CheckInformation.MyNumber)
@Html.ValidationMessageFor(model => model.CheckInformation.MyNumber)
</div>
生成的HTML是:
<input class="text-box single-line" data-val="true" data-val-remote="Bummer"
data-val-remote-additionalfields="*.MyNumber" data-val-remote-url="/Home/IsValidMyNumber"
data-val-required="The Number field is required." id="CheckInformation_MyNumber"
name="CheckInformation.MyNumber" type="text" value="" />
当我调试并进入控制器时,"MyNumber"参数为null,即使我在它所代表的文本框中有文本。
我知道文本框中的名称必须与参数中的名称相同,我已经验证了这一点。
有什么想法吗?
似乎您的输入字段的生成名称是:
name="CheckInformation.MyNumber"
这可能是因为您的视图模型是您在问题中显示的内容的父模型,并且您使用了以下内容:
@Html.TextBoxFor(x => x.CheckInformation.MyNumber)
因此,请确保您已经指定了这个前缀,否则默认的模型绑定器将永远无法重新水合这些值:
public ActionResult IsValidMyNumber([Bind(Prefix = "CheckInformation")] string myNumber)
{
var test = services.ValidateMyNumber(myNumber);
return Json(test, JsonRequestBehavior.AllowGet);
}
您还可以接收myNumber的值,以便在操作参数Like中传递视图模型。它对我有用。
public ActionResult IsValidMyNumber(YourViewModel vm)
{
var test = services.ValidateMyNumber(vm.myNumber);
return Json(test, JsonRequestBehavior.AllowGet);
}