#c# #.net #asp.net-mvc #validation #asp.net-mvc-5
#c# #.net #asp.net-mvc #проверка #asp.net-mvc-5
Вопрос:
Я следую за блогом ScottGus здесь — Основное требование, которое у меня есть, это то, что у меня есть два текстовых поля на экране — я хочу проверить, являются ли оба они пустыми и нажата кнопка Sumite, которую я хочу отобразить для использования, требуется одно или другое
У меня есть пользовательская модель, как показано ниже:
public class UserViewModel : IValidatableObject
{
[Display(Name = "Name:")]
public string UserName { get; set; }
[Display(Name = "User Account Number:")]
public string UserAccountNumber { get; set; }
public bool UserHasName()
{
return !string.IsNullOrEmpty(UserName);
}
public bool UserHasAccountNumber()
{
return !string.IsNullOrEmpty(UserAccountNumber);
}
public IEnumerable<ValidationResult> Validate(ValidationContext validationContext)
{
if (!UserHasName() amp;amp; !UserHasAccountNumber())
{
yield return new ValidationResult("Please enter an Account Number or Name ", new [] {"UserName"});
}
}
}
На мой взгляд, у меня есть:
@Html.TextBoxFor(m => m.UserName, new { @class = "form-control", @placeholder = "UserName" })
@Html.ValidationMessageFor(m => m.UserName)
В Webconfig у меня есть следующее :
<add key="ClientValidationEnabled" value="true" />
<add key="UnobtrusiveJavaScriptEnabled" value="true" />
Однако, когда я нажимаю кнопку отправки с пустыми обоими полями, на экране не отображается сообщение об ошибке?
Обновить
В конфигурации пакета я также использую jQuery.validate.unobtrusive:
bundles.Add(new ScriptBundle("~/bundles/jquery").Include(
"~/Scripts/jquery-{version}.js",
"~/Scripts/jquery.validate.js",
"~/Scripts/jquery.validate.unobtrusive.js"));
Хотя впоследствии я включаю js для bootstrap и kendo ui — может ли это вызвать какой-то конфликт?
Обновлены два
Код контроллера:
public ActionResult UserDetails()
{
if (ModelState.IsValid)
{
// IsValid is true so code goes in here when text fields are blank??
//redirect to another view
}
return View();
}
У меня действительно есть класс JsonValididationFilterAttribute — код, как показано ниже — хотя, как я уже сказал, по какой-то причине точка останова при проверке или это OnActionExecuting не выполняется?
public override void OnActionExecuting(HttpActionContext actionContext)
{
if (actionContext.ModelState.IsValid) return;
var errorMessages = actionContext.ModelState.Values
.SelectMany(modelState => modelState.Errors);
actionContext.Response = actionContext.Request.CreateErrorResponse(HttpStatusCode.BadRequest, Json.Encode(errorMessages));
}
Комментарии:
1. Вы проверяете свою модель (ModelState. Является ли значение VALID) в контроллере?
2. @idlerboris — да, я проверяю ModelState. isValid — однако при отправке формы с пустыми полями в точке останова значение isValid равно true, а также, если я установлю точку останова в методе Validate в ViewModel, она не попадет?
3. Можете ли вы прикрепить код вашего контроллера?
4. Используете ли вы пользовательский modelbinder?
5. @idlerboris — вопрос снова обновлен
Ответ №1:
Я думаю, вам следует вставить параметр в свой метод action, вот так:
public ActionResult UserDetails(UserViewModel model)
В противном случае MVC не понял, что вы хотите вызвать Validate
для этой модели.
Ответ №2:
Возможно, вам понадобится дополнительный javascript:
включить jquery.unobtrusive-ajax.js файл.
<script src="~/Scripts/jquery.unobtrusive-ajax.js"></script>
Вы можете найти его в NuGet Packages: Microsoft.jQuery.Unobtrusive.Ajax
.