MVC远程验证,参数为null

Pac*_*man 5 asp.net-mvc asp.net-mvc-3 remote-validation

public class UserModel
    {
        public LogOnModel LogOnModel { get; private set; }
        public RegisterModel RegisterModel { get; private set; }
    }
Run Code Online (Sandbox Code Playgroud)

在我的RegisterModel中,我有这样的电子邮件地址:

[RegularExpression(@"^([a-zA-Z0-9_\-\.]+)@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.)|(([a-zA-Z0-9\-]+\.)+))([a-zA-Z]{2,4}|[0-9]{1,3})(\]?)$")]
        [Required]
        [Display(Name = "E-mail")]
        [Remote("IsEmailAddressAvailable", "Validation", HttpMethod = "POST")]
        public string EmailAddress { get; set; }
Run Code Online (Sandbox Code Playgroud)

我的validationController:

public class ValidationController : Controller
    {
        public JsonResult IsEmailAddressAvailable([string emailAddress)
        {
            return Json(false, JsonRequestBehavior.AllowGet);

        }
}
Run Code Online (Sandbox Code Playgroud)

视图@Model是UserProfile,ValidationController中的emailAddress为null.

我试图将ValidationController更改为这样,没有运气:

public class ValidationController : Controller
    {
        public JsonResult IsEmailAddressAvailable([Bind(Include = "EmailAddress")]RegisterModel register)
        {
            return Json(false, JsonRequestBehavior.AllowGet);

        }


    }
Run Code Online (Sandbox Code Playgroud)

小智 9

您对使用Bind属性的想法是正确的.而是使用Include参数,您应该使用Prefix参数.所以你的控制器应该看:

public class ValidationController : Controller
    {
        public JsonResult IsEmailAddressAvailable([Bind(Prefix = "RegisterModel.EmailAddress")]string EmailAddress)
        {
            return Json(false, JsonRequestBehavior.AllowGet);

        }
    }
Run Code Online (Sandbox Code Playgroud)

因此Prefix参数将浏览器发送的参数与action参数绑定.


dak*_*ait 1

我想到的原因是,当您将另一个模型(RegisterModel)作为另一个模型的属性(UserModel)时,当您使用助手Html来渲染模型属性时,例如

@Html.TextBoxFor(x=>x.RegisterModel.EmailAddress)
Run Code Online (Sandbox Code Playgroud)

它会呈现出类似的效果

<input type="text" name="RegisterModel.EmailAddress"/>
Run Code Online (Sandbox Code Playgroud)

MVC模型绑定string emailAddress适用于名称属性,您在第一个示例中接收,RegisterModel model在第二次尝试中,尝试使用UserModel model作为远程验证 ActionResult 的接收参数,例如

public JsonResult IsEmailAddressAvailable(UserModel model)
        {
            return Json(false, JsonRequestBehavior.AllowGet);

        }
Run Code Online (Sandbox Code Playgroud)