使用 RedirectToAction 且不使用 TempData 在 post 之后显示确认消息

Display confirmation message after post with RedirectToAction and without TempData

我遇到了一些看似简单的问题,但是我在 SO 和 Google 中找到的所有答案都不适用。

我正在为现有系统创建 MVC 页面,这需要:

所以,我有一个 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"/>
        }

提交此表格会使我转到正确的 Post 操作

    [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,所以我想答案很简单,但我认为我发现的所有内容都不适用我的情况。干杯!

2 种方法:

ViewBag 使用 ViewBag 动态对象设置消息。例如在您要设置消息的控制器中:ViewBag.EnterANameForYourMessage = "your message string here";

ViewBag 在 Controller 和 View 之间传递,它是一个动态对象,您可以在其中添加任何类型的任何 属性 名称。它 但是,建议您在再次 using/parsing 时确切地知道这些类型是什么。

然后在您的视图上,检查“ViewBag.EnterANameForYourMessage”对象是否不为空(或使用“!string.IsNullOrWhiteSpace()”方法)。如果不是,则显示 div 中的值。

Model 添加某种 "message" string 属性 到 Controller/View 之间传递的对象。

在解析消息的位置,将字符串添加到 "message" 属性。

然后,return模型到视图。

我在应用程序中执行此操作,所以我正在使用的方法可能有点不对(它还早,我不记得确切的名字了)。

希望对您有所帮助!

如果不使用 TempData,您有几个选择:

  • 通过 QueryString 提供消息,您甚至不需要更改目标控制器操作,只需使用 Request.QueryString["key"] 捕获值 - 如果您希望保留目标操作原样
  • 存储您在目标操作中删除的临时 cookie(听起来有点矫枉过正,但这是一个选项)
  • 如果您不想以纯文本形式传递消息,您可以使用(例如通过 QS)您在查找或字典甚至您的底层存储系统上拥有的消息的 ID,并且只使用该无法破译的 ID在目标操作上检索消息并将其发送到视图

在目标操作上获得消息或 ID 后,您可以使用 ViewBag、ViewData 或模型本身向视图提供该信息。

带参数的重定向,

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; }
    }

然后在视图中显示。 在视图中

<p> @Model.Message </p>