C # mvc2 проверка на стороне клиента с помощью xval, предотвратить публикацию - PullRequest
5 голосов
/ 16 апреля 2010

Я использую xval , чтобы использовать проверку на стороне клиента в моем веб-приложении asp.net mvc2. Несмотря на ошибки, возникающие при вводе текста в числовое поле, он все еще пытается отправить форму в базу данных. Неверные значения заменяются на 0 и сохраняются в базе данных. Но вместо этого не должно быть возможности попытаться отправить форму. Может ли кто-нибудь помочь мне здесь?

Я установил атрибуты, как показано ниже:

[Property]
[ShowColumnInCrud(true, label = "FromPriceInCents")]
[Required]
//[Range(1, Int32.MaxValue)]
public virtual Int32 FromPriceInCents{ get; set; }

Контроллер, перехватывающий запрос, выглядит так, как показано ниже; Я не получаю ошибок в этой части.

[AcceptVerbs(HttpVerbs.Post)]
[Transaction]
[ValidateInput(false)]
public override ActionResult Create()
{
  //some foo happens
}

Мой взгляд выглядит следующим образом:

<div class="label"><label for="Price">FromPrice</label></div>
<div class="field">
<%= Html.TextBox("FromPriceInCents")%>
<%= Html.ValidationMessage("product.FromPriceInCents")%></div>

И в конце представления у меня есть следующее правило, которое в HTML-коде генерирует правильные правила проверки

<%= Html.ClientSideValidation<Product>("Product") %>

Я надеюсь, что кто-то может помочь мне с этим вопросом, заранее спасибо!

РЕДАКТИРОВАТЬ: 19 апреля Я только что узнал, что вместо ввода используется обычная кнопка type = "Button" Может ли это быть проблемой?

<button class="save" type="submit" name="save"><span>Opslaan</span></button>

Ответы [ 3 ]

3 голосов
/ 22 апреля 2010
2 голосов
/ 18 апреля 2010

Моя первая и главная проблема здесь будет: почему ваше приложение в первую очередь сохраняет значения в базе данных? Хотя xVal - это хороший способ сделать приложение удобным для пользователя, вы все равно ДОЛЖНЫ выполнять проверку на стороне сервера. Если вы не проверяете свои данные на сервере - у вас большая дыра в безопасности! Попробуйте проверить, есть ли ModelState.IsValid в вашем контроллере перед сохранением значений.

Теперь, как я вижу, вы регистрируете проверку xVal с помощью

<%= Html.ClientSideValidation<Product>("Product") %>

Способ, которым он работает, заключается в том, что он обеспечивает проверку на стороне клиента для всех элементов управления с префиксом «Product». С другой стороны, ваше текстовое поле имеет идентификатор FromPriceInCents

Таким образом, решение здесь было бы сделать это:

<%= Html.TextBox("FromPriceInCents")%>
<%= Html.ValidationMessage("FromPriceInCents")%>

<%= Html.ClientSideValidation<Product>() %>

UPD3 Я обновил пост. Исправлена ​​ошибка, при которой код не использовался.

Кроме того, я скомпилировал рабочее решение, которое содержит рабочее решение. Свойства List, Edit, Create page, string и int и проверка xVal.

public class Product
{
    [ScaffoldColumn(false)]
    public int Id { get; set; }

    [Required]
    [Range(1,50)]
    public int PriceInCents { get; set; }

    [Required]
    [StringLength(50)]
    public string Name { get; set; }
}

и на виду

<%= Html.TextBoxFor(model => model.PriceInCents) %>
<%= Html.ValidationMessageFor(model => model.PriceInCents) %>

Вот ссылка на скачивание. Проверьте это и скажите, работает ли он http://www.flexlabs.org/download/xValTest

0 голосов
/ 16 апреля 2010

Почему у вас есть атрибут Range закомментированный? Со свойствами, которые вы указали, если в текстовое поле введено что-либо, оно должно пройти проверку на стороне клиента.

...