ASP.NET MVC用户消息传递实现

时间:2009-12-21 19:54:59

标签: asp.net-mvc validation

好的,假设您的视图有四个部分(每个部分具有单独的视图模型),这些部分都与主视图模型相关联。您点击提交和所有数据发布。您运行一些服务器端验证,并注意到4个部分中的3个中的字段中发生验证错误。所以,我想回发验证错误,但高于它们所属的部分。

您的实施想法是什么?

2 个答案:

答案 0 :(得分:2)

有趣的场景。如果我理解正确:您希望验证复杂的表单帖子,如果它无效,则将它们返回到视图并在各自的表单区域上方显示错误消息。您无法使用<%= Html.ValidationSummary()%>的原因是否需要对表单的不同区域使用不同的摘要,具体取决于哪些是有效的,哪些不是?

带上一粒盐,但我要做的是为每个表格区域或部分写一个自定义的HtmlHelper。您可以将自定义代码基于Html.ValidationSummary的当前实现,并找到代码here。在每个自定义验证摘要中,您可以在ModelState中查找特定错误并显示这些错误。我没有太多时间,也没有经过测试,但这可能会让你开始:

public static class CustomValidationExtensions
{
    public static string CustomValidationSummary(this HtmlHelper htmlHelper)
    {
        if (!htmlHelper.ViewData.ModelState.ContainsKey("YourFormName"))
            return null;

        ModelState modelState = htmlHelper.ViewData.ModelState["YourFormName"];
        ModelErrorCollection modelErrors = (modelState == null) ? null : modelState.Errors;
        ModelError modelError = ((modelErrors == null) || (modelErrors.Count == 0)) ? null : modelErrors[0];

        if (modelError == null)
            return null;

        TagBuilder builder = new TagBuilder("span");
        builder.MergeAttribute("class", HtmlHelper.ValidationMessageCssClassName);
        builder.SetInnerText(modelError.ErrorMessage);

        return builder.ToString(TagRenderMode.Normal);
    }
}

这只检查一个ModelState元素并显示一些html。您需要手动添加所有ModelState元素或循环遍历集合,并仅显示应用于该部分视图的错误消息。无论哪种方式,我认为最好的办法是以典型的方式向ModelState添加错误,并直接使用ModelState来显示适用于该部分的错误。当然,您可以操作html并使用输出执行任何操作。

答案 1 :(得分:0)

不同的问题,同样的解决方案:

Separating two forms in the same view in ASP.Net MVC