MVC3 передает сообщения от одного контроллера к другому представлению и/или контроллеру

У меня есть веб-приложение MVC3 С#.Net. который имеет функцию импорта из Excel. Эта функция выполняется в методе Import контроллера Rate. Он отображается в представлении «Скорость/импорт». При импорте какие-то строки проходят успешно, какие-то нет. Я собираю ошибки в массив string[]. Импорт считается успешным, если одна или несколько строк были успешно импортированы, поэтому приложение возвращается к представлению «Редактирование предложения». Я хочу передать информационные ошибки обратно в представление редактирования предложения для отображения. Любые идеи, как это сделать?


person MikeTWebb    schedule 09.02.2012    source источник
comment
Когда приложение возвращается к редактированию предложения, вы имеете в виду, что выполняете перенаправление после отправки формы? Если это так, единственное место, где вы сможете хранить информацию, — это база данных (передача идентификатора другому контроллеру для поиска строк), сеанс или файл cookie. Жизненный цикл ViewBag/ViewData заканчивается вместе с запросом. Перенаправление создает новый запрос из браузера.   -  person Nick Bork    schedule 09.02.2012


Ответы (1)


Есть несколько способов.

Временные данные

Это доступно в вашем контроллере. TempData сохраняется при одном перенаправлении.

public ActionResult Process()
{
    // ... Process your rows, get array of errors back ...

    TempData["errors"] = errors;
    return RedirectToAction("Edit");
}

public ActionResult Edit()
{
    var errors = (IEnumerable<string>)TempData["errors"];  // Get the errors back.
    return View(errors);  // Pass into the view
}

ModelState

Вы можете добавить эти ошибки непосредственно в ModelState, а затем повторно отобразить форму редактирования. Он не сохраняется при перенаправлении.

public ActionResult Process()
{
    // ... Process your rows, get array of errors back ...

    for(var i = 0; i < errors.Length; i++)
    {
        ModelState.AddModelError("row" + i, errors[i]);
    }

    // Can't redirect here - ModelState doesn't persist.
    return View("Edit");
}

Затем в представлении редактирования просто отобразите сводку проверки:

@Html.ValidationSummary("The following row errors occured:");

Это отобразит этот html. Класс по умолчанию установлен MVC.

<div class="validation-summary-errors">
    <span>The following row errors occured:</span>
    <ul>
        <li>...Error 1...</li>
        ... Other errors ...
    </ul>
</div>
person Leniency    schedule 09.02.2012
comment
@снисходительность....большое спасибо. Хорошая вещь! Вопрос по ModelState.... как ModelState отображает ошибки? Нужен ли дополнительный код в представлении «Правка»? Спасибо - person MikeTWebb; 13.02.2012
comment
@MikeTWebb Да, последняя строка, @Html.ValidationSummary("The following row errors occured:");, отображает все ошибки в ModelState. Обновлен мой ответ с тем, что это делает. - person Leniency; 17.02.2012