16

最初のデータセットがセッションに保存される2段階のフォームプロセスがあります。

[IsMp4File]
[Required(ErrorMessage = "* Please select a video to upload")]
public HttpPostedFileBase VideoClip { get; set; }

[Required(ErrorMessage = "* Please select a thumbmail image")]
public HttpPostedFileBase VideoThumbnail{ get;  set; }

public string VideoFileName { get { return VideoClip.FileName; } }

public NewsWizardStep CurrentStep { get; set; }

..。

public enum NewsWizardStep : int
{
  One = 1,
  Two = 2,
  Three = 3,
  Four = 4,
  Five = 5,
  Six = 6
}

コントローラ

public ActionResult TvCreate(TvNewsVideoVM modelVM)
{
   if (modelVM.CurrentStep == NewsWizardStep.Two)
   {
     var sessionModel = ((TvNewsVideoVM)Session["TvModelVM"]);

     modelVM.VideoClip = sessionModel.VideoClip;
     modelVM.VideoThumbnail = sessionModel.VideoThumbnail;
   }

   if (TryValidateModel(modelVM))
   {
     ...
   }
}

TryValidateModel(modelVM)seesionModelからviewModelにマッピングしているにもかかわらず、VideoClipとVideoThumnailが必要であると言ってfalseを返します。ブレークポイントを追加し、それらがnullでないことを確認しました。

ModelStateとValidateModel()がどのように機能するかについて、私が知らない基本的な機能がいくつかあるようですが、何がわからないだけです。

アップデート

私は問題を解決したとは言えませんが、それほどきれいではない回避策を見つけました。ModelStateに入ると、ModelValueを設定しSetModelValue()、モデル状態から手動でエラーを削除してから呼び出すTryValidateModel()ことができます。値を追加する必要はなく、試したことのないエラーを削除するだけです。これが私の回避策です。

if (modelVM.CurrentStep == NewsWizardStep.Two)
{
  var sessionModel = ((MtTvNewsVideoVM)Session["MtTvModelVM"]);

  modelVM.VideoClip = sessionModel.VideoClip;
  modelVM.VideoThumbnail = sessionModel.VideoThumbnail;

  ModelState.SetModelValue("VideoClip", new  ValueProviderResult(sessionModel.VideoThumbnail, sessionModel.VideoFileName, CultureInfo.CurrentCulture));
                ModelState.SetModelValue("VideoThumbnail", new ValueProviderResult(sessionModel.VideoClip, sessionModel.VideoFileName, CultureInfo.CurrentCulture));

  ModelState["VideoClip"].Errors.RemoveAt(0);
  ModelState["VideoThumbnail"].Errors.RemoveAt(0);
}
4

1 に答える 1

29

モデルのバインド中に、DefaultModelBinderアクションパラメータを検証します。したがって、実行がpublic ActionResult TvCreate(TvNewsVideoVM modelVM)メソッドにヒットすると、にModelStateはすでに検証エラーが含まれています。
呼び出しTryValidateModelてもクリアされないModelStateため、検証エラーが残ります。そのため、falseが返されます。ModelStateしたがって、後で手動で検証をやり直す場合は、コレクションをクリアする必要があります。

public ActionResult TvCreate(TvNewsVideoVM modelVM)
{
   ModelState.Clear();

   if (modelVM.CurrentStep == NewsWizardStep.Two)
   {
     var sessionModel = ((TvNewsVideoVM)Session["TvModelVM"]);

     modelVM.VideoClip = sessionModel.VideoClip;
     modelVM.VideoThumbnail = sessionModel.VideoThumbnail;
   }

   if (TryValidateModel(modelVM))
   {
     ...
   }
}
于 2011-12-20T21:01:06.017 に答える