MVC远程验证,参数为null

时间:2012-10-11 21:02:13

标签: asp.net-mvc asp.net-mvc-3 remote-validation

public class UserModel
    {
        public LogOnModel LogOnModel { get; private set; }
        public RegisterModel RegisterModel { get; private set; }
    }

在我的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; }

我的validationController:

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

        }
}

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

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

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

        }


    }

5 个答案:

答案 0 :(得分:8)

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

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

        }
    }

So Prefix参数将浏览器发送的参数与action参数绑定。

答案 1 :(得分:3)

我怀疑这是一个模型绑定问题。尝试将动作签名更改为以下内容:

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

请注意[Bind(Prefix="RegisterModel")],这与您在后一次尝试中尝试的内容略有相似,所以我认为您走在正确的轨道上。我基本上从发布here的非常相似的答案中提取了这个,所以如果这对你没有那么好的话,也许这条路可以帮助你进一步。

答案 2 :(得分:0)

我想到的原因是,当您使用另一个模型(RegisterModel)作为另一个模型的属性(UserModel)时,当您使用Html帮助器来呈现模型属性时

@Html.TextBoxFor(x=>x.RegisterModel.EmailAddress)

它将呈现类似

的东西
<input type="text" name="RegisterModel.EmailAddress"/>

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

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

        }

答案 3 :(得分:0)

您必须在验证程序中返回true(验证已通过)或错误消息的字符串。见这里:http://msdn.microsoft.com/en-us/library/gg508808(v=vs.98).aspx

public class ValidationController : Controller {
    public JsonResult IsEmailAddressAvailable(string EmailAddress) {
        return Json("Email Address unavailable", JsonRequestBehavior.AllowGet);
    }
}

答案 4 :(得分:0)

This article可能会有所帮助。特别是ValidationController的构造函数。