0

コントロールの Label と Required メタデータを設定する EditorTemplate (文字列用) 内から呼び出す拡張メソッドがあります。(モデルに注釈を付けることができないため、これを行っています)。

 public static void SetMetadata(this ViewUserControl control)
    {
        if (!string.IsNullOrEmpty((string)control.ViewData["labeltext"]))
            control.ViewData.ModelMetadata.DisplayName = (string)control.ViewData["labeltext"];

        if (control.ViewData["required"] != null)
            control.ViewData.ModelMetadata.IsRequired = (bool)control.ViewData["required"];
    }

Required = trueに設定したフィールドで ModelState.IsValid が取得されない理由は誰にもありますか?

4

2 に答える 2

3

ここでの問題は、ページのリクエストに応じて を変更しModelMetadataていることです。getこの情報はpost、アクションを実行しても保持されません ( ViewStateMVC には esque メカニズムがないため)。

検証しようとしているクラスは としてマークされていpartialますか? その場合は、クールMetadataType属性を使用して、クラスを検証属性で装飾できます。

[MetadataType(typeof(JobOpening_Validation))]
public partial class JobOpening
{
     //JobOpening is generated by LinqToSql but I want to validate the Title Property
}

internal class JobOpening_Validation
{
    [Required]
    [StringLength(150, ErrorMessage = "Must be under 150 characters")]
    public string Title { get; set; }
}

この「使い捨て」( JobOpening_Validation) クラスを使用して、「ターゲット」( JobOpening) クラスで検証したい同じプロパティを作成します。「使い捨て」クラスの属性の装飾は、「ターゲット」クラスにコピーされます。

これがうまくいかない場合はFilterAttribute、メソッドを作成してオーバーライドしOnActionExecuting、そこでモデルの検証を実行できます。それに応じてモデル状態を更新することもできます。

于 2011-02-23T03:04:21.963 に答える