使用RedirectToAction并且没有TempData

时间:2016-05-07 07:36:16

标签: c# asp.net-mvc post-redirect-get

我遇到的问题显然很简单,但我在SO和Google中找到的所有答案都不适用。

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

  • 传递两个参数的初始Get方法(启用页面的'上下文) - jobIdparentId
  • 会话状态已禁用,因此TempData不是选项。

所以,我有一个Index()方法,它根据来自DB的两个参数和数据构建模型。

 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所以我认为答案非常简单,但是我发现所有的东西都不适用于我的情况。干杯!

3 个答案:

答案 0 :(得分:2)

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

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

在目标操作上获得消息或id后,您可以使用ViewBag,ViewData或Model本身将该信息提供给视图。

答案 1 :(得分:0)

你可以采取两种方式:

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

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

然后在View上,检查`ViewBag.EnterANameForYourMessage'对象是否为null(或使用'!string.IsNullOrWhiteSpace()'方法)。如果不是,则显示div中的值。

OR

模型在Controller / View之间传递的对象中添加某种“message”string属性。

在解析消息的地方,将您的字符串添加到“message”属性中。

然后,像以前一样将模型返回到视图。

我在应用程序中这样做,所以我正在使用的方法可能有点过时(早期,我不记得我头顶的确切名称)。

希望这有帮助!

答案 2 :(得分: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>