0

ビュー内に次の 2 つのフィールドがあります。

<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 の場合、ユーザーは次のメッセージを受け取ります。

  3. ユーザーが ConsoleServerID が null のフォームを送信しようとすると、次の例外が発生します。

System.Data.Entity.Validation.DbUnexpectedValidationException はユーザー コードによって処理されませんでした。詳細については、内部例外を参照してください。ソース = 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, List1 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、IDictionary)2 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=メソッドまたは操作が実装されていません。ソース = MVC フールプルーフ検証 StackTrace: Foolproof.ModelAwareValidationAttribute.IsValid(オブジェクト値) で System.ComponentModel.DataAnnotations.ValidationAttribute.IsValid(オブジェクト値、

4

2 に答える 2

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 に答える
1

多くの ajax 呼び出しを行います。クライアント側の検証をトリガーする方法は

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

form.valid は、フォームの検証をトリガーします

于 2014-04-24T15:58:44.470 に答える