使用RenderPartialToString时显示模型状态错误的问题

时间:2010-04-29 19:20:05

标签: asp.net asp.net-mvc json partial-views

我使用以下代码:

public string RenderPartialToString(ControllerContext context, string partialViewName, ViewDataDictionary viewData, TempDataDictionary tempData)
    {
        ViewEngineResult result = ViewEngines.Engines.FindPartialView(context, partialViewName);

        if (result.View != null)
        {
            StringBuilder sb = new StringBuilder();
            using (StringWriter sw = new StringWriter(sb))
            {
                using (HtmlTextWriter output = new HtmlTextWriter(sw))
                {
                    ViewContext viewContext = new ViewContext(context, result.View, viewData, tempData, output);
                    result.View.Render(viewContext, output);
                }
            }

            return sb.ToString();
        }

        return String.Empty;
    }

通过JSON返回部分视图和表单。它可以正常工作,但是一旦我得到模型状态错误,我的ValidationSummary就不会显示。 JSON仅返回默认表单,但不突出显示验证错误或显示验证摘要。

我错过了什么吗?

这就是我调用RenderPartialToString的方式:

string partialView = RenderPartialToString(this.ControllerContext, "~/Areas/User/Views/Account/ChangeAccountDetails.ascx", new ViewDataDictionary(avd), new TempDataDictionary());

4 个答案:

答案 0 :(得分:3)

在这个问题上花了太多时间之后,我发现不应该将ModelState项添加到viewContext.Controller.ViewData.ModelState,而应将其添加到viewContext.ViewData.ModelState。进行此更改后,正在呈现ModelState错误。

答案 1 :(得分:2)

我遇到了类似代码的相同问题:

添加以下行时所有修复:

// copy model state items to the html helper
                foreach (var item in context.Controller.ViewData.ModelState)
                    html.ViewData.ModelState.Add(item);

如果我为这个特定场景做了一个端口,那就像

    ViewContext viewContext = new ViewContext(context, result.View, viewData, tempData, output);

//Copy the ModelSate            
    foreach (var item in context.Controller.ViewData.ModelState)
    viewContext.Controller.ViewData.ModelState.Add(item);

result.View.Render(viewContext, output);

答案 2 :(得分:0)

这就是我做的工作:

foreach (var item in context.Controller.ViewData.ModelState)
{
    viewContext.Controller.ViewData.ModelState.Add(item);
}

不确定为什么我需要{}的..

答案 3 :(得分:0)

我在上述评论中提到的所有解决方案都存在一些问题,因此我对其进行了一些改进,以确保它在所有可能的情况下都能正常运行:

foreach (var item in controllerContext.Controller.ViewData.ModelState)
{
    if (item.Value.Errors.Any())
    {
        viewContext.ViewData.ModelState.Add(item);    
    }
}