C# mvc2 проверка на стороне клиента с помощью xval, предотвратить публикацию
Я использую 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 ответа
Может быть, это могло бы помочь:
Как использовать плагин проверки jQuery вместе с метаданными, формами jQuery и xVal?
Моя первая и главная проблема заключается в следующем: почему ваше приложение в первую очередь сохраняет значения в базе данных? Хотя 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
Почему у вас есть атрибут Range закомментированный? С указанными вами свойствами, пока что-либо вводится в текстовое поле, оно должно пройти проверку на стороне клиента.