У меня есть следующие два поля внутри моего представления: -
<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) |
The rule I want to implement is that both fields are NullAble, but if the user selects a ConsoleServerID , then he needs to add a Port . and if the user leave the ConsoleServerID null then he should not enter a Port number. So what is the best way to implement this scenario , so that I have both client side and server side validation ? Thanks
Изменить После установки защиты от дурака я столкнулся со следующими проблемами: -
проверка на стороне клиента не выполняется, и проверка выполняется при проверке того, действительно ли состояние модели внутри моего класса контроллера
если [RequiredIfNotEmpty] имеет значение false, то пользователь получит следующее сообщение: - Порт сервера консоли требуется из-за того, что идентификатор ConsoleServerID не пуст. Поэтому вместо имени поля, которое является тегом сервера консоли, будет отображаться идентификатор ConsoleServerID.
если пользователь попытался отправить форму, в которой ConsoleServerID имеет значение null, я получу следующее исключение: -
Исключение System.Data.Entity.Validation.DbUnexpectedValidationException не было обработано кодом пользователя HResult=-2146233087 Message=Непредвиденное исключение возникло во время проверки «Консольного порта сервера» при вызове Foolproof.RequiredIfNotEmptyAttribute.IsValid. Подробности смотрите во внутреннем исключении. Source=EntityFramework StackTrace: в System.Data.Entity.Internal.Validation.ValidationAttributeValidator.Validate(EntityValidationContext entityValidationContext, свойство InternalMemberEntry) в System.Data.Entity.Internal.Validation.PropertyValidator.Validate(EntityValidationContext entityValidationContext, InternalMemberEntry property) в System.Data.Entity.Internal.Validation.PropertyValidator.Validate(EntityValidationContext entityValidationContext, InternalMemberEntry property) в System.Data.Entity.Internal.Validation.PropertyValidator.Validate Data.Entity.Internal.Validation.EntityValidator.ValidateProperties (EntityValidationContext entityValidationContext, InternalPropertyEntry parentProperty, элементы List
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.Mevc.ControllerActionControlInvokerth.Invoke 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.EndInv okeActionMethod(IAsyncResult asyncResult) в System.Web.Mvc.Async.AsyncControllerActionInvoker.‹>c__DisplayClass37.‹>c__DisplayClass39.b__33() в System.Web.Mvc.Async.AsyncControllerActionInvoker.‹>c__DisplayClass4f.b__49() InnerException: System.NotImplementedException HResult=-2147467263 Сообщение=Метод или операция не реализованы. Source = MVC Foolproof Validation StackTrace: в Foolproof.ModelAwareValidationAttribute.IsValid (значение объекта) в System.ComponentModel.DataAnnotations.ValidationAttribute.IsValid (значение объекта, ValidationContext validationContext) в System.ComponentModel.DataAnnotations.ValidationAttribute.GetValidationResult (значение объекта, ValidationContext validationContext) ) в System.Data.Entity.Internal.Validation.ValidationAttributeValidator.Validate(EntityValidationContext entityValidationContext, свойство InternalMemberEntry) InnerException: