在.NET MVC中,是否有一种简单的方法来检查我是否在主页上?

时间:2012-06-27 18:32:59

标签: c# asp.net-mvc razor

如果用户从主页登录,我需要采取特定操作。在我的LogOnModel中,我有一个隐藏字段:

@Html.Hidden("returnUrl", Request.Url.AbsoluteUri)

在我的Controller中,我需要检查该值是否为主页。在下面的示例中,我正在检查用户是否在特定页面上(“Account / ResetPassword”)。有没有办法检查它们是否在主页上而不诉诸正则表达式?

    [HttpPost]
    public ActionResult LogOnInt(LogOnModel model)
    {
       if (model.returnUrl.Contains("/Account/ResetPassword"))
       {
          return Json(new { redirectToUrl = @Url.Action("Index","Home")});
       }

有什么想法吗?一百万谢谢!

4 个答案:

答案 0 :(得分:7)

解决此问题的一种方法是在RouteData中查找特定控制器。假设您用于主页的控制器称为“HomeController”,则请求的RouteData将包含“Controller”键的值“Home”。

它看起来像这样:

而不是(或者除了你有其他理由之外):

 @Html.Hidden("returnUrl", Request.Url.AbsoluteUri)
你会得到:

 @Html.Hidden("referrer", Request.RequestContext.RouteData.Values['Controller'])

你的控制器看起来像:

[HttpPost]
public ActionResult LogOnInt(LogOnModel model)
{
   if (model.referrer = "Home")
   {
      return Json(new { redirectToUrl = @Url.Action("Index","Home")});
   }
 }

这将消除使用.Contains()

的需要

更新

您还可以通过将引荐来源网址(Request.UrlReferrer.AbsoluteUri)映射到路由来消除对隐藏字段的需求(从而降低应用程序中每个页面的整体页面权重)。这里有一篇关于此的帖子。

How to get RouteData by URL?

我们的想法是使用mvc引擎将引用网址映射到LogOnInt方法中的MVC路由,从而允许代码完全自包含。

这可能比把控制器名称和操作名称放在那里更干净,让全世界都可以看到脚本以将其推回服务器。

答案 1 :(得分:5)

在任何视图中,以下代码返回当前控制器名称。

@ViewContext.Controller.ValueProvider.GetValue("controller").RawValue.ToString()

这很容易吗? :)

答案 2 :(得分:3)

您可以通过

获取当前网址
string controller = (string)ViewContext.RouteData.Values["controller"];
string action = (string)ViewContext.RouteData.Values["action"];
string url = Url.Action(action, controller);

您可以在HtmlHelper或呈现登录视图的控制器中执行此操作。

url存储在隐藏字段中,然后将其存储在后期操作中:

[HttpPost]
public ActionResult LogOnInt(LogOnModel model)
{
   // Create your home URL
   string homeUrl = Url.Action("Index", "Home");
   if (model.referrer == homeUrl)
   {
      return Json(new { redirectToUrl = @Url.Action("Index","Home")});
   }
 }

使用Url.Action的好处是它将使用您的路由表生成URL,这意味着如果您的路由发生变化,您将不必更改此代码。

答案 3 :(得分:0)

您可以使用

  Request.Url.AbsoluteUri

然后只需检查字符串中的页面名称。

可能不是最好的方式,但它是一种快速简便的方式。

我从这个页面得到了这个方法:

How to get current page URL in MVC 3

还有另一个答案可能对你有用。