У меня есть мини-форма, которая состоит из всех блоков выбора и списков флажков.
У меня уже есть аннотации данных в модели представления.Поэтому, если я отправляю форму (без включенного javascript), ModelState.IsValid
работает так, как должно.
Но при проверке клиента у меня возникают проблемы.У меня есть ненавязчивая проверка jquery, но когда я делаю $("#form").valid()
, он всегда возвращает true.
Я не уверен, как настроить это и проверить условия.Например, у меня есть флажок, который по умолчанию ничего не проверял.Так что если ничего не проверено, .valid()
должен вернуть false.Кроме того, 2 из выпадающих меню имеют опцию «пожалуйста, выберите» в качестве первого, но JQuery по-прежнему возвращает действительным.Серверная сторона ModelState.IsValid
работает для обоих из них.
Ниже приведен пример:
@using (Html.BeginForm("index", "home", FormMethod.Post, new { @id = "miniForm" })) {
@Html.ValidationSummary(true)
@Html.AntiForgeryToken()
<div>
@Html.LabelFor(m => m.NinjaType)
@Html.DropDownListFor(m => m.NinjaType, Model.NinjaTypeList) // First value is '0'. Rest of the list is of type STRING
</div>
/// following is the rendered html code as i created a helper for it which i've omitted in this example
<ul>
<li><input type="checkbox" id="poo1" name="pie" value="one" />one</li>
<li><input type="checkbox" id="poo2" name="pie" value="two" />two</li>
<li><input type="checkbox" id="poo3" name="pie" value="three" />three</li>
</ul>
<input type="submit" id="submitButton" />
}
Если это помогает, это действие контроллера POST:
public ActionResult Index(SuperDooperNinjaViewModel m)
{
if (this.ModelState.IsValid)
return Redirect("win");
else
return Redirect("fail");
}
Я думал, что сделаю это по старинке $('#submitButton').click();
, но у меня есть ощущение, что может быть лучший способ сделать это.Еще один способ, о котором я подумал, это превратить его в форму Ajax.Таким образом, в ответе на стороне сервера вместо Redirect("fail");
я возвращаю JsonResult
.
Итак, в общем, каков наилучший способ проверки этой формы?
- Значение NinjaType должно не быть '0'
- Должен быть установлен по крайней мере один флажок.
Заранее спасибо
ОБНОВЛЕНИЕ:
ViewModel:
public class SuperDooperViewModel
{
[Required]
public string NinjaType {get;set;}
public IEnumerable<SelectItemList> { get;set; }
[Required]
public string[] pie {get;set;} // checkbox
public IEnumerable<string> PieList { get;set; } // list of values for checkbox
}
В jquery я тестирую это так:
$("#submitButton").click(function(e) {
e.preventDefault();
if ($("#miniForm").valid())
alert("valid");
else
alert("fail");
});