Проверка клиента не сработала на очень простом примере - PullRequest
0 голосов
/ 24 марта 2012

Я пытаюсь использовать проверку на стороне клиента на очень простом примере, и она не работает.Я начал с существующего примера из Интернета.

Вот оно (см. Принятый ответ): Ненавязчивая пользовательская проверка ASP .Net MVC 3

В основном, он используетэтот блог как решение: http://benjii.me/2010/11/credit-card-validator-attribute-for-asp-net-mvc-3/

Итак, я начал с пустого решения и хотел бы подтвердить, что цена больше минимальной.

Мой контроллер:

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

    [HttpPost]
    public ActionResult Index(MinPriceViewModel model)
    {
        if (!ModelState.IsValid)
            return View(model);

        return Content("Thank you very much");
    }
}

Моя модель просмотра:

public class MinPriceViewModel
{
    [MinPrice(MinPrice=9.99)]
    [Required]
    public double Price { get; set; }
}

Атрибут для проверки (клиент и сервер):

public class MinPriceAttribute : ValidationAttribute, IClientValidatable
{
    public double MinPrice { get; set; }

    public override bool IsValid(object value)
    {
        if (value == null)
            return true;

        var price = Convert.ToDouble(value);

        if (price < MinPrice)
        {
            return false;
        }

        return true;
    }

    public override string FormatErrorMessage(string name)
    {
        return "Attention le champ " + name + " ne contient pas un prix acceptable.";
    }

    public IEnumerable<ModelClientValidationRule> GetClientValidationRules(ModelMetadata metadata, ControllerContext context)
    {
        yield return new ModelClientValidationRule
        {
            ErrorMessage = this.ErrorMessage,
            ValidationType = "minprice"
        };
    }
}

Представление:

@model MinPriceValidation.Models.MinPriceViewModel

@{
    ViewBag.Title = "Home Page";
}

<script src="../../Scripts/jquery.validate.js" type="text/javascript"></script>
<script src="../../Scripts/jquery.validate.unobtrusive.js" type="text/javascript"></script>

<script type="text/javascript">
    $(function () {
        jQuery.validator.unobtrusive.adapters.addBool('minprice');
    }); 
</script>

@using(Html.BeginForm())
{
    @Html.LabelFor(m => m.Price)
    @Html.TextBoxFor(m => m.Price)
    @Html.ValidationMessageFor(m => m.Price)

    <input type = submit />
}

Я установил точку останова на своем пост-действии в контроллере, чтобы проверить, прошла ли проверка клиента или сервера.Когда я запускаю решение, набираю 1 и отправляю сообщение, в моем контроллере достигается точка останова (после действия) >> Я пришел к выводу, что проверка клиента никогда не используется.

Я не понял, потому что начал сбазовый пример (проверка кредитной карты), и я знаю, что проверка кредитной карты работает в проверке клиента (я проверял это в другом решении).

Я немного потерян.

Есть идеи, почему проверка клиента не сработала?

Спасибо.


ОБНОВЛЕНИЕ

После длительного поиска я вижу, чтонекоторые люди говорят, что нам нужна функция javascript для проверки клиента, например:

    jQuery.validator.addMethod("minprice", function (value, element, param) {
        // Perform tests here for client validation
        return (value>10);
    });

    jQuery.validator.unobtrusive.adapters.addBool('minprice');

Когда я тестирую с этой добавленной функцией javascript, она работает, но мне кажется странным, что в примере карты Creait нетФункция JavaScript в представлении для проверки кредитной карты!

Я все еще потерян.

Ответы [ 2 ]

1 голос
/ 25 марта 2012

Когда вы говорите, что вы видите людей, использующих это с кредитной картой, и это работает без необходимости пользовательской функции javascript, я предполагаю, что вы ссылаетесь на следующий пост .

A Правило проверки кредитной карты напрямую встроено в плагин проверки jquery.Вот почему вам не нужно писать собственную функцию проверки.

Что касается правила minprice, то такого нет, поэтому вам нужно написать собственную функцию javascript, чтобы определить, что означает minprice.

При этом мне кажется, что вы заново изобретаете колесо с этим атрибутом, как вы могли бы просто сделать:

[Range(9.99, double.MaxValue)]
[Required]
public double Price { get; set; }

, и поскольку мы говорим о ценах, рекомендуется использоватьдесятичный тип вашей модели:

[Range(9.99, double.MaxValue)]
[Required]
public decimal Price { get; set; }

Теперь вы получите автоматическую проверку на стороне клиента и на стороне сервера.

1 голос
/ 24 марта 2012

Убедитесь, что эти настройки верны в web.config:

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

И этот скрипт включает в страницу:

<script src="@Url.Content("~/Scripts/jquery-1.5.1.min.js")" type="text/javascript"></script>
<script src="@Url.Content("~/Scripts/jquery.validate.min.js")" type="text/javascript"></script>
<script src="@Url.Content("~/Scripts/jquery.validate.unobtrusive.min.js")" type="text/javascript"></script>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...