我在AdminUsers视图中的网格上有一个链接
grid.Column(header: "", format: (item) => (condition ? Html.ActionLink("Impersonate", "Impersonate", "Admin", new { id = item.username }, null) : Html.Label("Impersonate"), style: "webgrid-column-link"),
在控制器中,我有
public ActionResult Impersonate(string id)
{
string result = ORCA.utilities.users.setImpersonation(id);
if(result == "nocommonfields")
return RedirectToAction("AdminUsers", "Admin");
else
return RedirectToAction("terms_of_use", "Forms");
}
当我返回AdminUsers页面时,如何发送错误消息?
答案 0 :(得分:23)
您可以使用 TempData
if(result == "nocommonfields")
{
TempData["ErrorMessage"]="This is the message";
return RedirectToAction("AdminUsers", "Admin");
}
在您的AdminUsers操作中,您可以阅读它
public ActionResult AdminUsers()
{
var errMsg=TempData["ErrorMessage"] as string;
//check errMsg value do whatever you want now as needed
}
请记住,TempData的寿命很短。 Session是临时数据背后的备份存储。
或者,您也可以考虑在查询字符串中发送一个标记,并在下一个操作方法中读取它,并确定要显示的错误消息。
答案 1 :(得分:2)
TempData
控制器属性可用于实现此类功能。我认为它的主要缺点是它使用会话存储来存储其内容。这意味着您将有额外的工作让它在Web场上运行,或者您需要首先打开会话。
关于TempData
的好处就是你想做的事情。它是一个基于字符串的字典,您可以在其中放入任何内容,默认情况下只将其输出一次。所以在致电RedirectToAction()
之前,你要设置你的信息。在下一个请求中,您检查消息并显示它们。通过检索邮件,它们会在请求结束时自动删除。
作为替代方案,您可以使用cookie在两个请求之间传输消息。基本上,您可以推出自己的解决方案,也可以实现通过Cookie传输TempData
内容的自定义ITempDataProvider
。请注意,您需要正确保护Cookie。如果你自己动手,MachineKey.Protect()
可以帮到你。
我遇到了您遇到的同样问题,并为其创建了一个名为 FlashMessage 的解决方案。也许这可以为你节省一些工作。它也可以在NuGet上找到。用法很简单:您只需在调用RedirectToAction()
之前对消息进行排队,如下所示:
if(result == "nocommonfields")
{
FlashMessage.Warning("Your error message");
return RedirectToAction("AdminUsers", "Admin");
}
在您的视图中,您包含以下语句以呈现任何以前排队的消息:
@Html.RenderFlashMessages()