【问题标题】:MVC3 client validation not workingMVC3 客户端验证不起作用
【发布时间】:2011-01-26 09:45:09
【问题描述】:

我的模型上有一个必需的注释:

[Required(ErrorMessage = "Please choose an option")]
public bool? AnyDebts { get; set; }

我已在 web.config 中启用客户端验证:

   <appSettings>
    <add key="ClientValidationEnabled" value="true" />
    <add key="UnobtrusiveJavaScriptEnabled" value="true" />
  </appSettings>

我在布局中引用了 jquery 脚本:

<script src="@Url.Content("~/Scripts/jquery-1.4.4.min.js")" type="text/javascript"></script>
<script src="@Url.Content("~/Scripts/jquery-1.4.4.js")" type="text/javascript"></script>
<script src="@Url.Content("~/Scripts/jquery.validate.js")" type="text/javascript"></script>
<script src="@Url.Content("~/Scripts/jquery.validate.unobtrusive.js")" type="text/javascript"></script>
<script src="@Url.Content("~/Scripts/jquery-ui-1.8.6.custom.min.js")" type="text/javascript"></script>

我还需要做什么才能使客户端验证正常工作? 服务器端验证仍在工作。

编辑:

啊哈!

我发现客户端验证正在运行。

但是,具体来说,我发现客户端未验证模型属性是那些使用自定义属性进行注释的属性。 例如:

[BooleanRequiredToBeTrue(ErrorMessage = "You must agree to the statements listed")]
public bool StatementAgree { get; set; }

属性代码:

public class BooleanRequiredToBeTrueAttribute: RequiredAttribute
{
    public override bool IsValid(object value)
    {
        return value != null && (bool)value;
    }
}

这些不再是经过验证的客户端了吗?

【问题讨论】:

  • 你为什么要调用 jquery 两次?

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


【解决方案1】:
<script src="@Url.Content("~/Scripts/jquery-1.4.4.js")" type="text/javascript"></script>
<script src="@Url.Content("~/Scripts/jquery.validate.js")" type="text/javascript"></script>
<script src="@Url.Content("~/Scripts/jquery.validate.unobtrusive.js")" type="text/javascript"></script>

是客户端验证工作所需的唯一脚本。

和往常一样,这里有一个完整的工作演示:

型号:

public class MyViewModel
{
    [Required(ErrorMessage = "Please choose an option")]
    public bool? AnyDebts { get; set; }
}

控制器:

public class HomeController : Controller
{
    public ActionResult Index()
    {
        return View(new MyViewModel());
    }

    [HttpPost]
    public ActionResult Index(MyViewModel model)
    {
        return View(model);
    }
}

查看:

@model AppName.Models.MyViewModel
@{
    ViewBag.Title = "Home Page";
}
<script src="@Url.Content("~/Scripts/jquery.validate.js")" type="text/javascript"></script>
<script src="@Url.Content("~/Scripts/jquery.validate.unobtrusive.js")" type="text/javascript"></script>
@using (Html.BeginForm())
{
    <div>Debts</div>
    <span>Yes</span> @Html.RadioButtonFor(x => x.AnyDebts, true)
    <span>No</span> @Html.RadioButtonFor(x => x.AnyDebts, false)

    @Html.ValidationMessageFor(x => x.AnyDebts)
    <input type="submit" value="OK" />
}

备注:我的视图中没有包含jquery-1.4.4.js,因为它已经在布局中引用。

【讨论】:

【解决方案2】:

看看这段代码。

    [AttributeUsage(AttributeTargets.Property | AttributeTargets.Field | AttributeTargets.Parameter, AllowMultiple = false)]
public class RequiredIfAttribute : RequiredAttribute
{
    public string PropertyName { get; set; }
    public Enums.BasicOperationType BasicOperationType { get; set; }

    public RequiredIfAttribute(string propertyName, Enums.BasicOperationType BasicOperationType)
    {
        this.PropertyName = propertyName;
        this.BasicOperationType = BasicOperationType;
    }

    protected override ValidationResult IsValid(object value, ValidationContext validationContext)
    {
        Type objectType = validationContext.ObjectType;
        PropertyInfo[] neededProperties = objectType.GetProperties().Where(propertyInfo => propertyInfo.Name == PropertyName).ToArray();
        if (Core.Helpers.EnumHelper.TryParse<Enums.BasicOperationType>(Convert.ToInt16(neededProperties[0].GetValue(validationContext.ObjectInstance, null))) == BasicOperationType)
            return base.IsValid(value, validationContext);

        return base.IsValid(0, validationContext);
    }
}

【讨论】:

    【解决方案3】:

    就我而言,它仅在使用 IE 以怪癖模式时发生,我的设置是浏览器模式:IE9,文档模式:怪癖。这导致客户端验证对我不起作用。但是,在使用开发者工具栏时,同一页面在 Firefox、Chrome 和 IE9、浏览器模式:IE9、文档模式:IE9 标准下运行良好。不是它的解决方案,而是一个可能的线索

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-06-16
      • 1970-01-01
      • 1970-01-01
      • 2012-12-17
      相关资源
      最近更新 更多