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);
}
}
答案 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的构造函数。