2

2つのモデルを含むParentModelを含むビューがあります。どちらかのフィールドのみを検証したい。両方ではありません。私が持っているとしましょう:

public ParentModel{
  public BlueUser BlueUser {get; set;}
  public GreenUser GreenUser {get; set;}
}

したがって、ユーザーは自分がGreenUserまたはBlueUserのいずれかを選択します。ユーザーのタイプごとに異なるフィールドがあり、ユーザーが選択するユーザーのタイプに応じて、その特定のタイプのユーザーのフィールドのみを検証したいと思います。これはどのように達成できますか?

編集:両方のフォーム/モデルは同じビュー上にある必要があります、おそらくいくつかのJQueryまたはパーシャルを使用しますか?

4

3 に答える 3

8

で 1 つのフォームを作成し、 でもう 1 つのフォームを作成HtmlHelper<BlueUser>HtmlHelper<GreenUser>、異なるアクションに投稿させます。

まず、ビューモデルは次のとおりです。

@model ParentModel

次にHtmlHelperFor、サブモデルごとに HtmlHelper を作成するために使用します。

@{
   var blueHtml = Html.HtmlHelperFor(Model.BlueUser);
   var greenHtml = Html.HtmlHelperFor(Model.GreenUser);
}

@using (blueHtml.BeginForm("BluePost", null)) {
   @blueHtml.EditorForModel()
}

@using (greenHtml.BeginForm("GreenPost", null)) {
   @greenHtml.EditorForModel()
}

最後に、コントローラーでフォームごとに異なる POST アクションを作成します。

[HttpPost]
public ActionResult BluePost(BlueUser model) {
   ...
}

[HttpPost]
public ActionResult GreenPost(GreenUser model) {
   ...
}

拡張方法は次のとおりです。

public static class HtmlHelperFactoryExtensions {

   public static HtmlHelper<TModel> HtmlHelperFor<TModel>(this HtmlHelper htmlHelper) {
      return HtmlHelperFor(htmlHelper, default(TModel));
   }

   public static HtmlHelper<TModel> HtmlHelperFor<TModel>(this HtmlHelper htmlHelper, TModel model) {
      return HtmlHelperFor(htmlHelper, model, null);
   }

   public static HtmlHelper<TModel> HtmlHelperFor<TModel>(this HtmlHelper htmlHelper, TModel model, string htmlFieldPrefix) {

      var viewDataContainer = CreateViewDataContainer(htmlHelper.ViewData, model);

      TemplateInfo templateInfo = viewDataContainer.ViewData.TemplateInfo;

      if (!String.IsNullOrEmpty(htmlFieldPrefix))
         templateInfo.HtmlFieldPrefix = templateInfo.GetFullHtmlFieldName(htmlFieldPrefix);

      ViewContext viewContext = htmlHelper.ViewContext;
      ViewContext newViewContext = new ViewContext(viewContext.Controller.ControllerContext, viewContext.View, viewDataContainer.ViewData, viewContext.TempData, viewContext.Writer);

      return new HtmlHelper<TModel>(newViewContext, viewDataContainer, htmlHelper.RouteCollection);
   }

   static IViewDataContainer CreateViewDataContainer(ViewDataDictionary viewData, object model) {

      var newViewData = new ViewDataDictionary(viewData) {
         Model = model
      };

      newViewData.TemplateInfo = new TemplateInfo { 
         HtmlFieldPrefix = newViewData.TemplateInfo.HtmlFieldPrefix 
      };

      return new ViewDataContainer {
         ViewData = newViewData
      };
   }

   class ViewDataContainer : IViewDataContainer {

      public ViewDataDictionary ViewData { get; set; }
   }
}
于 2012-06-24T18:03:18.033 に答える
0

解決策1

依存関係の検証を使用します。デフォルトでは組み込まれていません。属性のみです。ラジオボタンの値が何かである場合や、 Mvc.ValidationTookitCompareのようなものを使用できる場合に必要なように、独自の属性を構築できます。


解決策2

たとえば、ユーザーが青いユーザーを選択した場合、JavaScriptを使用してフォーム送信イベントをチェックインします。ユーザーが選択した内容に応じて何を選択したかを、パラメーターとして渡された適切なモデルを使用してさまざまなアクションに誘導します。

于 2012-06-24T17:03:44.037 に答える
0

サーバー側の実装

  1. ビューに 2 つのフォームが表示されます。

  2. 各フォームは、投稿時にコントローラーの異なるアクションに移動する必要があります。

アニメーションのクライアント側実装

  1. 好きな JavaScript ライブラリを使用して、1 つのフォームを無効にし、もう 1 つのフォームをマウス フォーカスで有効にすることができます。
于 2012-06-24T18:03:01.487 に答える