使用 RedirectToAction 且不使用 TempData 在 post 之后显示确认消息
Display confirmation message after post with RedirectToAction and without TempData
我遇到了一些看似简单的问题,但是我在 SO 和 Google 中找到的所有答案都不适用。
我正在为现有系统创建 MVC 页面,这需要:
- 传递两个参数的初始 Get 方法(启用页面的 'context')-
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"/>
}
提交此表格会使我转到正确的 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>
我遇到了一些看似简单的问题,但是我在 SO 和 Google 中找到的所有答案都不适用。
我正在为现有系统创建 MVC 页面,这需要:
- 传递两个参数的初始 Get 方法(启用页面的 'context')-
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"/>
}
提交此表格会使我转到正确的 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>