2016-05-07 3 views
2

У меня проблема с чем-то явно простым, однако все ответы, которые я нахожу в SO и Google, неприменимы.Отобразите сообщение с подтверждением после сообщения с RedirectToAction и без TempData

Я создаю страницу MVC для существующей системы, которая требует:

  • начальный Получить метод передать два параметра (что позволяет «контекст» страницы) - jobId и parentId.
  • состояние сеанса отключено, поэтому TempData не является вариантом.

Итак, у меня есть метод Index(), который строит модель на основе двух параметров и данных из БД.

public ActionResult Index(int jobId, int? parentId = null) 
    { 
     //build model based on Id params 
     var model = new JobModel 
     { 
      ... 
     }; 
     return View(model); 
    } 

мнение имеет несколько форм на нем, которые позволяют какие-либо действия проводились на модели (добавлять файлы, удалять файлы)

  @using (Html.BeginForm("AddNewFiles", "Home", FormMethod.Post, new {enctype = "multipart/form-data"})) 
     { 
      @Html.HiddenFor(m => m.JobId) 
      @Html.HiddenFor(m => m.ParentId) 
      @Html.TextBoxFor(m => m.AdditionalFiles, new {type = "file", multiple = "true"}) 
      @Html.ValidationMessageFor(m => m.AdditionalFiles) 
      <input type="submit" name="SubmitNewFiles" id="SubmitNewFiles" value="Upload"/> 
     } 

Представление этой формы перемещает меня в нужное сообщение действие

[HttpPost] 
    public ActionResult AddNewFiles(JobModel jobModel) 
    { 
     if (!ModelState.IsValid) 
     { 
      throw new InvalidDataException(message: "Model is invalid"); 
     } 
     //doing some stuff with the files here 
     //... 

     //now I want to get back to the initial page with forms etc, however show a temporary label somewhere saying that 'something happened OK' 
     return RedirectToAction("Index", routeValues: new RouteValueDictionary(values: new 
     { 
      jobId = job.Id, 
      parentId = job.OrganizationId 
     })); 
    } 

Проблема в том, что я не знаю, как я могу показать сообщение на странице. Как я уже сказал, я не могу использовать TempData (это 50% ответы).

Другие решения включают в себя return View("Index") вместо return RedirectToAction("Index") - однако в данном случае я не знаю, как я мог бы передать соответствующие параметры для моего Index(int jobId, int? parentId = null) метода, так что обновленная модель может быть сгенерирован.

Я только начинаю с MVC, поэтому, я полагаю, ответ довольно прост, однако все, что я нашел, не применимо в моем случае, я думаю. Ура!

+0

Вы всегда можете просто добавить еще один параметр 'строку message' в файл' Index() 'метода и передать его в' routeValues' –

+0

Я думал об этом ... но - у меня будет ок. 5 форм, каждый из которых должен отображать другое сообщение, поэтому я хотел, чтобы сообщения отображались в разных местах (над каждой соответствующей формой). Кроме того, если я добавлю его в routeValues, он появится в ссылке, правильно? (Я не хочу, чтобы это произошло) – Bartosz

+0

Тогда у вас нет другого выбора, кроме как сохранить его где-нибудь (например, базу данных). Но почему у вас есть 5 форм в представлении, которые предлагают проблему с вашим дизайном? –

ответ

2

Без использования TempData у вас есть несколько вариантов:

  • питания сообщение через QueryString, где вы даже не нужно, чтобы изменить целевое действие контроллера, вы можете просто захватить значение с помощью Request.QueryString [«ключ»] - если вы хотите сохранить целевое действие как
  • Храните временный файл cookie, который вы устраняете на целевом действии (звучит немного избыточно, но это вариант)
  • Если вы не хотите передайте сообщение в виде обычного текста, который вы можете использовать (например, через QS) идентификатор для сообщения, которое вы имеете в Поиске или Словаре, или даже Основная система хранения данных и использовать только что расшифровку идентификатор на целевом действие, чтобы получить сообщение и отправить его в представление

После того, как у вас есть сообщение или идентификатор на целевом действии вы можете использовать ViewBag, ViewData или модель чтобы обеспечить эту информацию для представления. Параметр

0

2 способами вы могли бы сделать это:

ViewBag Используйте ViewBag динамический объект, чтобы установить сообщение в Э.Г.. в вашем контроллере, где вы хотите установить сообщение: ViewBag.EnterANameForYourMessage = "your message string here";

ViewBag передается между контроллером и представлением и является динамическим объектом, в котором вы можете добавлять любые имена свойств любым типом. Однако - это, однако вы знаете, что именно эти типы вы используете, когда вы снова используете/разбираете их.

Затем в вашем представлении проверьте, не является ли объект ViewBag.EnterANameForYourMessage недействительным (или использует метод '! String.IsNullOrWhiteSpace()'). Отобразите значение в div, если это не так.

ИЛИ

Модель Добавить какое-то «сообщение» string свойства объекта передается между контроллером/View.

Когда вы разбираете сообщение, добавьте строку в свойство «сообщение».

Затем верните модель на вид, как и раньше.

Я делаю это в приложении, поэтому методы, о которых я нахожусь, могут немного отличаться (его рано, и я не могу вспомнить точные имена с головы).

Надеюсь, это поможет!

+0

Привет, Geoff. Что касается ViewBag, он очищается при использовании RedirectToAction, поэтому это не сработает ...Что касается сообщения в модели, я не уверен, что мне нравится эта идея (в конце концов, «сообщение подтверждения» или что-то еще не является частью объекта Job) – Bartosz

+0

Хорошая точка с ViewBag @Bartosz. И я согласен; использование сообщения в модели было бы вне сферы охвата того, для чего предназначен объект Job. Другое предположение заключалось бы в том, чтобы позволить 'Index()' action также принимать строку '? message = null' в качестве аргумента, а затем использовать его в ViewBag (как я предложил) - передав 'message =" xyz ";' в ваш 'новый RouteValueDictionary'. –

+0

Тогда сообщение появится в URL-адресе, который, я думаю, тоже кажется неправильным :( – Bartosz

0

Перенаправление с параметром,

return RedirectToAction("Action", new { id = 10}); 

Ручка в ActionResult и набор сообщений, модели.

public ActionResult Action(int id) 
     { 
      if(id == 10) 
      { 
       Model.Message = "Success"; 
      } 
      return View(Model); 
     } 

Модель,

public class ViewModel 
    { 
     public string Message { get; set; } 
    } 

Тогда покажите его в поле зрения. В View

<p> @Model.Message </p> 

 Смежные вопросы

  • Нет связанных вопросов^_^