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

我的验证控制器:

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

        }
}

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

我试图将 ValidationController 更改为如下所示,但没有运气:

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

        }


    }
4

4 回答 4

12

Your thinking about using Bind attribute is correct. Instead using Include parameter, you should use Prefix parameter. So your controller should look:

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

        }
    }

So Prefix parameter binds parameter sent by browser with action parameter.

于 2012-10-18T21:43:53.393 回答
3

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

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

请注意[Bind(Prefix="RegisterModel")],这与您在后一次尝试中尝试做的事情有点相似,所以我认为您走在正确的轨道上。我基本上是从这里发布的一个非常相似的答案中提取出来的,所以如果这对你不太有用,也许这条线索可以进一步帮助你。

于 2012-10-17T16:59:18.737 回答
1

我想到的原因是,当您使用另一个模型(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);

        }
于 2012-10-12T05:13:13.093 回答
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);
    }
}
于 2012-10-18T21:57:18.727 回答