1

タイトルに記載されているように、かみそりは、ページがエラーまたは通常の状態でレンダリングされるタイミングをどのように知るのですか?

検証メッセージなどが表示されたエラーモードでページを表示できるように、この情報を知る必要があります。残念ながらView()、無効な状態のモデルを検出するコードがサブビューにあるため、単純に表示することはできません。

編集
私はかみそりにエラーモードでビューをレンダリングさせるためにこのようなことをしようとしています:

// just for tests....
// model: a model which was marked as invalid in different controller
// state: state of the model from that controller
public ActionResult asdf(TModel model, ModelStateDictionary state) {
    var result = View(this.Partial, model);
    result.ViewData.ModelState.Clear();
    foreach (var x in state) {
        result.ViewData.ModelState.Add(x.Key, x.Value);
    }

    return result;
}

EDIT2
最終的な解決策。以前の試みでは、Jsonからc#型への自動逆シリアル化が機能しなかったため(原文のまま)、プレーンなjson文字列を受け取り、次のような別のライブラリで逆シリアル化することにしました。

public ActionResult ErrorIndex(string jsonParamsString) {
    var param = Newtonsoft.Json.JsonConvert.DeserializeObject<ForceInvalidStateRequestArg<TModel>>(jsonParamsString);

    if (param != null && param.Errors != null) {
        this.ModelState.Clear();
        foreach (var s in param.Errors) {
            this.ModelState.AddModelError(s.PropertyName, s.ErrorMessage);
        }
    }
    var result = View(this.PartialName, param == null ? this.NewModel : param.Model);
    return result;
}
4

1 に答える 1

2

モデルの妥当性に関する情報はModelStateオブジェクトに保存されます。

これは、次のようなコントローラーでアクセスできます。

this.ModelState.IsValid

ビューで:

this.ViewContext.ViewData.ModelState

あなたの編集へ:

次のようなモデル検証エラーを追加できます。

this.ModelState.AddModelError("key", "an error message");

したがって、@razorに検証エラーメッセージを表示させる場合。次のようになります。

public ActionResult asdf(TModel model, ModelStateDictionary state) 
{
    var result = View(this.Partial, model);
    result.ViewData.ModelState.Clear();
    foreach (var pair in state.Where(m=> m.Value != null && m.Value.Errors.Any()))
    {
        result.ViewData.ModelState.AddModelError(pair.Key, string.Join(",",pair.Value.Errors.Select(e=>e.ErrorMessage).ToArray()));
    }  
    return result;
}
于 2013-01-16T09:51:29.590 に答える