21

問題

ユーザーが編集できるフィールドのリストがあります。モデルが提出されたら、このアイテムが有効かどうかを確認したい. 各フィールドには実行時までわからない異なる検証プロセスがあるため、データ表記を使用できません。検証が失敗した場合はModelState.AddModelError(string key, string error)、エラー メッセージを追加する html 要素の名前をキーとして使用します。フィールドのリストがあるため、Razor が html アイテムに対して生成する名前はFields[0].DisplayName. 私の質問は、ビューモデルから生成されたhtml名のキーを取得する方法または方法はありますか?

試みられた解決策

toString()鍵の方法を試してみましたが、うまくいきませんでした。クラスも調べましたHtmlHelperが、役立つメソッドは見当たりませんでした。

コードスニペット

モデルを見る

public class CreateFieldsModel
{
    public TemplateCreateFieldsModel()
    {
        FreeFields = new List<FieldModel>();
    }

    [HiddenInput(DisplayValue=false)]
    public int ID { get; set; }

    public IList<TemplateFieldModel> FreeFields { get; set; }


    public class TemplateFieldModel
    {
        [Display(Name="Dispay Name")]
        public string DisplayName { get; set; }

        [Required]
        [Display(Name="Field")]
        public int FieldTypeID { get; set; }
    }
}

コントローラ

public ActionResult CreateFields(CreateFieldsModel model)
{
    if (!ModelState.IsValid)
    {
        //Where do I get the key from the view model?
        ModelState.AddModelError(model.FreeFields[0], "Test Error");
        return View(model);
    }
}
4

2 に答える 2

29

ソースコードを掘り下げた後、解決策を見つけました。ExpressionHelperが呼び出されたときにフィールドの html 名を生成するために使用されるクラスがありEditorFor()ます。このExpressionHelperクラスには、GetExpressionText()その html 要素の名前である文字列を返すメソッドが呼び出されます。これがそれを使用する方法です...

for (int i = 0; i < model.FreeFields.Count(); i++)
{
    //Generate the expression for the item
    Expression<Func<CreateFieldsModel, string>> expression = x => x.FreeFields[i].Value;
    //Get the name of our html input item
    string key = ExpressionHelper.GetExpressionText(expression);
    //Add an error message to that item
    ModelState.AddModelError(key, "Error!");
}

if (!ModelState.IsValid)
{
    return View(model);
}
于 2012-06-19T16:15:11.050 に答える
0

フォーム内のフィールドのレンダリング方法に基づいて、コントローラー内でキー (入力要素の名前) をフレーム化する必要があります。

たとえば。FreeFieldsのコレクションの2 番目の項目の検証が失敗した場合は、検証エラーがマップされる場所CreateFieldsModelとして、入力要素の名前、つまりキーをフレームに入れることができます。FreeFields[1].DisplayName

私の知る限り、コントローラーから簡単に取得することはできません。

于 2012-06-19T07:07:39.250 に答える