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

Asp.net mvc ASP.NET MVC用户消息传递实现,asp.net-mvc,validation,Asp.net Mvc,Validation,好的,假设您的视图有四个部分(每个部分都有单独的视图模型),它们都绑定到主视图模型。点击submit,所有数据都会发布出来。您运行了一些服务器端验证,发现验证错误出现在4个部分中的3个字段中。因此,我想将验证错误发回,但要放在它们所属的部分之上 您的实施思路是什么?不同的问题,相同的解决方案: 有趣的场景。如果我理解正确:您希望验证一个复杂的表单帖子,如果它无效,则将其返回到视图,并在其各自的表单区域上方显示错误消息。您不能使用的原因是,根据哪些内容有效,哪些内容无效,表单的不同区域需要不同的摘

好的,假设您的视图有四个部分(每个部分都有单独的视图模型),它们都绑定到主视图模型。点击submit,所有数据都会发布出来。您运行了一些服务器端验证,发现验证错误出现在4个部分中的3个字段中。因此,我想将验证错误发回,但要放在它们所属的部分之上


您的实施思路是什么?

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


有趣的场景。如果我理解正确:您希望验证一个复杂的表单帖子,如果它无效,则将其返回到视图,并在其各自的表单区域上方显示错误消息。您不能使用的原因是,根据哪些内容有效,哪些内容无效,表单的不同区域需要不同的摘要

对此我持保留态度,但我要做的是为每个表单区域或部分表单编写一个定制的HtmlHelper。您可以根据Html.ValidationSummary的当前实现来编写自定义代码,并找到代码。在每个自定义验证摘要中,您可以查找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并对输出执行任何您想要的操作