RedirecttoAction包含错误消息

时间:2013-04-11 20:25:38

标签: asp.net-mvc redirecttoaction

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

2 个答案:

答案 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()