Проблема с отображением ошибок состояния модели при использовании RenderPartialToString - PullRequest
2 голосов
/ 29 апреля 2010

Я использую следующий код:

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 ]

3 голосов
/ 15 января 2012

Потратив слишком много времени на эту проблему, я увидел, что элементы ModelState не следует добавлять в viewContext.Controller.ViewData.ModelState, их нужно добавлять в viewContext.ViewData.ModelState. После внесения этого изменения ModelState были обработаны ошибки.

2 голосов
/ 30 апреля 2010

У меня была такая же проблема с похожим кодом:

Все исправлено при добавлении этих строк:

// 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);
0 голосов
/ 19 декабря 2014

У меня были некоторые проблемы со всеми решениями, представленными в приведенных выше комментариях, поэтому я немного усовершенствовал его, чтобы быть уверенным, что он работает надлежащим образом во всех возможных случаях:

foreach (var item in controllerContext.Controller.ViewData.ModelState)
{
    if (item.Value.Errors.Any())
    {
        viewContext.ViewData.ModelState.Add(item);    
    }
}
0 голосов
/ 30 апреля 2010

Вот что я сделал, чтобы все заработало:

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

Не знаю, зачем мне нужны {} х ..

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...