Razor如何知道何时将页面呈现为错误状态?

时间:2013-01-16 09:45:16

标签: c# asp.net-mvc razor

正如标题中所述:剃刀如何知道页面何时应该呈现错误或正常状态?

我需要知道这些信息,所以我可以在错误模式下显示页面并显示验证消息等。不幸的是,我不能简单地执行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;
}

1 个答案:

答案 0 :(得分: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;
}
相关问题