2014-04-24 2 views
0

У меня есть следующие два поля внутри моей точки зрения: -Лучший способ осуществить проверку Требовать, если другое поле не равно нулю

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

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

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

  2. Если [RequiredIfNotEmpty] является ложным, то suer получит следующее сообщение: - Порт консольного сервера требуется из-за того, что ConsoleServerID не пуст .so w hy ConsoleServerID будет отображаться вместо имени поля, которое является тегом консоли консоли.

  3. если пользователь пытался отправить форму, где ConsoleServerID является нулевым, тогда я буду recevie следующее исключение: -

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) на System.Data.Entity.Internal.Validation.EntityValidator.ValidateProperties (entityValidationContext entityValidationContext, InternalPropertyEntry parentProperty, Список элементы) в System.Data.Entity.DbContext.ValidateEntity (DbEntityEntry entityEntry, IDictionary 2 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.M vc.ControllerActionInvoker.InvokeActionMethod (ControllerContext controllerContext, ActionDescriptor actionDescriptor, IDictionary 2 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 asyncResult) в System.Web.Mvc.Async.AsyncControllerActionInvoker. <> c__DisplayClass37. <> c__DisplayClass39.b__33() at System.Web.Mvc.Async.AsyncControllerActionInvoker. <> c__DisplayClass4f.b__49() InnerException: System.NotImplementedException HResult = -2147467263 Сообщение = Метод или операция не реализованы. Источника = MVC Защищенные проверки StackTrace: в Foolproof.ModelAwareValidationAttribute.IsValid (значение объекта) в System.ComponentModel.DataAnnotations.ValidationAttribute.IsValid (Object значения, ValidationContext validationContext) в System.ComponentModel.DataAnnotations.ValidationAttribute.GetValidationResult (Object значение, validationContext validationContext) на System.Data.Entity.Internal.Validation.ValidationAttributeValidator.Validate (entityValidationContext entityValidationContext, InternalMemberEntry собственность) InnerException:

+1

Мне нравится foolproof http://stackoverflow.com/questions/12843282/conditional-validation-in-asp-net-mvc4 –

+0

, но разве надежная защита также будет реализована на стороне сервера?, Так что если хакер мимоходом проверка на стороне клиента, fooproof должен проверить проверку на сервере? –

+1

да это будет. просто выполните if (ModelState.IsValid) на контроллере, и он вернет false, если ваше условие не выполнено. –

ответ

1

Мы делаем много вызовов ajax. Как запустить проверка на стороне клиента

$('#btnClick').on('click', function(){ 
    if ($('form').valid()) { 
     $.ajax({ 
     //call here 
     }); 
    } 
}); 

form.valid запускает проверку на форме

+0

, но мне нужен более общий подход, который я могу повторно использовать все связанные с этим взгляды. FoolProof хорош, но я сталкиваюсь с проблемой при его использовании. –

+1

это не обязательно должен быть ajax-звонок посередине. Просто настройте его, чтобы запустить нажатие кнопки или какой-либо другой селектор и запустить form.valid. Удостоверьтесь, что у вас есть тег формы вокруг содержимого, которое вы хотите проверить. –

+0

Можете ли вы сделать chekc my Edit, пожалуйста, –

1

Лучший способ было бы поместить эту логику в модели

В вашей ViewModel, создать BOOL Собственость так:

public bool IsAddingPortRequired 
{ 
    get 
    { 
     return ConsoleServerID != null; 
    } 
} 

Затем используйте атрибут RequiredIf как это:

[RequiredIf("IsAddingPortRequired", true, ErrorMessage = "You must add a port Number")] 
+0

, так почему же я не могу использовать надежный вместо этого? и где мне нужно создать ISAddingPortRequired? внутри самого класса модели? –

+0

ха? 'RequiredIf' ** является ** надежным, поскольку встроенный сервер не имеет этого. да верьте, где у вас есть 'ConsoleServerID' – meda

+0

aha ok извините за это, но почему я не могу использовать [RequiredIfNotEmpty], то? –