Лучший способ реализовать проверку Require, если другое поле не равно NULL
У меня есть следующие два поля в моем представлении:-
<div>
<span class="f">@Html.DisplayNameFor(model=>model.Firewall.ConsoleServerID)</span>
@Html.DropDownListFor(model =>model.Firewall.ConsoleServerID, ((IEnumerable<IT.Models.ITConsoleServer>)ViewBag.Servers).Select(option => new SelectListItem {
Text = (option == null ? "None" : option.Technology.Tag),
Value = option.ConsoleServerID.ToString(),
Selected = (Model != null) && (Model.Firewall.ITConsoleServer != null) && (option.ConsoleServerID == Model.Firewall.ConsoleServerID)
}), "Choose...")
@Html.ValidationMessageFor(model =>model.Firewall.ConsoleServerID)
</div>
<div >
<span class="f">@Html.DisplayNameFor(model=>model.Firewall.ConsoleServerPort)</span>
@Html.TextBoxFor(model => model.Firewall.ConsoleServerPort)
@Html.ValidationMessageFor(model => model.Firewall.ConsoleServerPort) |
Правило, которое я хочу реализовать, состоит в том, что оба поля имеют значение NullAble, но если пользователь выбирает ConsoleServerID, ему необходимо добавить порт. и если пользователь оставит значение ConsoleServerID пустым, ему не следует вводить номер порта. Итак, каков наилучший способ реализации этого сценария, чтобы у меня была как проверка на стороне клиента, так и на стороне сервера? Спасибо
Редактировать После установки защиты от дурака я сталкиваюсь со следующими проблемами:-
не выполняется проверка на стороне клиента, и проверка выполняется при проверке, допустимо ли состояние модели внутри моего класса контроллера
если значение [RequiredIfNotEmpty] равно false, то администратор получит следующее сообщение:- Требуется порт консольного сервера, поскольку ConsoleServerID не пуст., поэтому вместо имени поля, которое является тегом консольного сервера, будет отображаться ConsoleServerID.
если пользователь попытался отправить форму, где ConsoleServerID имеет значение NULL, я получу следующее исключение:-
System.Data.Entity.Validation.DbUnexpectedValidationException не было обработано кодом пользователя HResult=-2146233087 Сообщение = При создании Foolproof.RequiredIfNotEmptyAttribute.IsValid возникла непредвиденная исключительная ситуация при проверке порта консольного сервера. Смотрите внутреннее исключение для деталей. Источник =EntityFramework StackTrace: в System.Data.Entity.Internal.Validation.ValidationAttributeValidator.Validate(EntityValidationContext entityValidationContext, InternalMemberEntry собственности) на System.Data.Entity.Internal.Validation.PropertyValidator.Validate(EntityValidationContext entityValidationContext, InternalMemberEntry собственности) в системе.Data.Entity.Internal.Validation.EntityValidator.ValidateProperties(EntityValidationContext entityValidationContext, InternalPropertyEntry parentProperty, Список
1 validationErrors) at System.Data.Entity.Internal.Validation.TypeValidator.Validate(EntityValidationContext entityValidationContext, InternalPropertyEntry property) at System.Data.Entity.Internal.Validation.EntityValidator.Validate(EntityValidationContext entityValidationContext) at System.Data.Entity.Internal.InternalEntityEntry.GetValidationResult(IDictionary
2 элемента) в System.Data.Entity.DbContext.ValidateEntity (DbEntityEntry entityEntry, IDictionary2 items) at System.Data.Entity.DbContext.GetValidationErrors() at System.Data.Entity.Internal.InternalContext.SaveChanges() at System.Data.Entity.Internal.LazyInternalContext.SaveChanges() at System.Data.Entity.DbContext.SaveChanges() at TMS.Models.Repository.Save() in c:\Users\Administrator\Desktop\New folder (19)\TMS\TMS\TMS\Models\Repository.cs:line 4614 at TMS.Controllers.FirewallController.Edit(FirewallJoin fj, FormCollection formValues) in c:\Users\Administrator\Desktop\New folder (19)\TMS\TMS\TMS\Controllers\FirewallController.cs:line 869 at lambda_method(Closure , ControllerBase , Object[] ) at System.Web.Mvc.ActionMethodDispatcher.Execute(ControllerBase controller, Object[] parameters) at System.Web.Mvc.ReflectedActionDescriptor.Execute(ControllerContext controllerContext, IDictionary
2 параметра) в System.Web.Mvc.ControllerActionInvoker.InvokeActionMethod (ControllerContext controllerContext, ActionDescriptor actionDescriptor, IDictionary2 parameters) at System.Web.Mvc.Async.AsyncControllerActionInvoker.<>c__DisplayClass42.<BeginInvokeSynchronousActionMethod>b__41() at System.Web.Mvc.Async.AsyncResultWrapper.<>c__DisplayClass8
1.b__7 (IAsyncResult _) в System.Web.Mvc.Async.AsyncResultWrapper.WrappedAsyncResult`1.End() в System.Web.Mvc.Async.AsyncControllerActionInvoker.EndInvokeActionMethod(IAsyncResult. As).AsyncControllerActionInvoker.<> C__DisplayClass37.<>C__DisplayClass39.b__33() в System.Web.Mvc.Async.AsyncControllerActionInvoker.<> C__DisplayClass4f.b__49() Внутреннее исключение: метод System.NotImp67 реализован - не реализован. Source=MVC Foalproof Validation StackTrace: at Foolproof.ModelAwareValidationAttribute.IsValid(значение объекта) в System.ComponentModel.DataAnnotations.ValidationAttribute.IsValid(значение объекта, ValidationContext validationConject.valid.Talject.TaljectTalTataTalponent). В качестве объекта.) в System.Data.Entity.Internal.Validation.ValidationAttributeValidator.Validate (EntityValidationContext entityValidationContext, свойство InternalMemberEntry) InnerException:
2 ответа
Лучше всего было бы применить эту логику в вашей модели.
В вашей ViewModel создайте свойство bool примерно так:
public bool IsAddingPortRequired
{
get
{
return ConsoleServerID != null;
}
}
Затем используйте ваш RequiredIf
атрибут, как это:
[RequiredIf("IsAddingPortRequired", true, ErrorMessage = "You must add a port Number")]
Мы делаем много вызовов AJAX. Как я запускаю проверку на стороне клиента
$('#btnClick').on('click', function(){
if ($('form').valid()) {
$.ajax({
//call here
});
}
});
form.valid запускает проверку формы