Лучший способ реализовать проверку 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 пустым, ему не следует вводить номер порта. Итак, каков наилучший способ реализации этого сценария, чтобы у меня была как проверка на стороне клиента, так и на стороне сервера? Спасибо

Редактировать После установки защиты от дурака я сталкиваюсь со следующими проблемами:-

  1. не выполняется проверка на стороне клиента, и проверка выполняется при проверке, допустимо ли состояние модели внутри моего класса контроллера

  2. если значение [RequiredIfNotEmpty] равно false, то администратор получит следующее сообщение:- Требуется порт консольного сервера, поскольку ConsoleServerID не пуст., поэтому вместо имени поля, которое является тегом консольного сервера, будет отображаться ConsoleServerID.

  3. если пользователь попытался отправить форму, где 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(IDictionary2 элемента) в 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, IDictionary2 параметра) в 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__DisplayClass81.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 запускает проверку формы

Другие вопросы по тегам