Проверка клиента MVC3 не работает - PullRequest
6 голосов
/ 26 января 2011

У меня есть необходимая аннотация на моей модели:

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

Это уже не проверенная сторона клиента?

Ответы [ 3 ]

6 голосов
/ 26 января 2011
<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 в свое представление, потому что на него уже есть ссылка в макете.

1 голос
/ 12 августа 2011

Посмотрите на этот код.

    [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);
    }
}
0 голосов
/ 22 мая 2012

В моем случае это происходит только при использовании IE в режиме причуд, мои настройки: режим браузера: IE9, режим документа: причуды. Это приводит к тому, что проверка на стороне клиента не работает для меня. Тем не менее, та же страница хорошо работает в Firefox, Chrome и IE9, режим браузера: IE9, режим документа: стандарты IE9 при использовании панели инструментов разработчика. Не то, чтобы это решение, но возможное лидерство

...