12

我的 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 页面时,如何发送错误消息以显示?

4

2 回答 2

33

您可以使用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 的生命周期很短。会话是临时数据背后的备份存储。

或者,您也可以考虑在您的查询字符串中发送一个标志并在您的下一个操作方法中读取它并决定要显示什么错误消息。

于 2013-04-11T20:28:54.800 回答
5

TempData控制器属性可用于实现这种功能。我认为它的主要缺点是它使用会话存储来存储其内容。这意味着您需要做额外的工作才能使其在网络场上运行,或者您首先需要打开会话。

好处TempData是这正是你想要的。它是一个基于字符串的字典,你可以在里面放任何东西,默认情况下只能取出一次。所以在打电话给RedirectToAction()你之前设置你的消息。在下一个请求中,您检查消息并显示它们。通过检索消息,它们会在请求结束时自动删除。

作为替代方案,您可以使用 cookie 在两个请求之间传输消息。本质上,您可以推出自己的解决方案,也可以实现自定义,通过 cookieITempDataProvider传输内容。TempData请注意,您需要正确保护 cookie。MachineKey.Protect()如果您自己滚动,可以为您提供帮助。

我遇到了同样的问题,并为它创建了一个名为FlashMessage的解决方案。也许这可以为您节省一些工作。它也可以在NuGet上使用。用法很简单:您只需在调用之前排队一条消息RedirectToAction(),如下所示:

if(result == "nocommonfields")
{
    FlashMessage.Warning("Your error message");
    return RedirectToAction("AdminUsers", "Admin");
}

在您看来,您包含以下语句来呈现任何先前排队的消息:

@Html.RenderFlashMessages()
于 2016-08-23T08:21:10.897 回答