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 ,那么他需要添加一个 Port 。如果用户将 ConsoleServerID 保留为空,则他不应输入端口号。那么实现此方案的最佳方法是什么,以便我同时拥有客户端和服务器端验证?谢谢

编辑 安装万无一失后,我面临以下问题:-

  1. 未实施客户端验证,并且在检查模型状态在我的控制器类中是否有效时正在实施验证

  2. 如果 [RequiredIfNotEmpty] 为 false,则用户将收到以下消息:- 由于 ConsoleServerID 不为空,因此需要控制台服务器端口。所以为什么将显示 ConsoleServerID 而不是控制台服务器标签的字段名称。

  3. 如果用户尝试提交 ConsoleServerID 为空的表单,那么我将收到以下异常:-

System.Data.Entity.Validation.DbUnexpectedValidationException 未被用户代码处理 HResult=-2146233087 消息=在调用 Foolproof.RequiredIfNotEmptyAttribute.IsValid 验证“控制台服务器端口”期间引发意外异常。有关详细信息,请参阅内部异常。Source=EntityFramework StackTrace:在 System.Data.Entity.Internal.Validation.PropertyValidator.Validate(EntityValidationContext entityValidationContext, InternalMemberEntry property) 在 System.Data.Entity.Internal.Validation.ValidationAttributeValidator.Validate(EntityValidationContext entityValidationContext, InternalMemberEntry property) 在 System. 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, 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, 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 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 Message=方法或操作未实现。Source=MVC Foolproof Validation StackTrace: at Foolproof.ModelAwareValidationAttribute.IsValid(Object value) at System.ComponentModel.DataAnnotations.ValidationAttribute.IsValid(Object value,

4

2 回答 2

1

我们做了很多ajax调用。我如何触发客户端验证是

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

form.valid 触发表单验证

于 2014-04-24T15:58:44.470 回答
1

最好的方法是将这个逻辑放在你的模型中

在您的 ViewModel 中,创建一个 bool 属性,如下所示:

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

然后,RequiredIf像这样使用您的属性:

[RequiredIf("IsAddingPortRequired", true, ErrorMessage = "You must add a port Number")]
于 2014-04-24T16:17:25.870 回答