2012-06-27 22 views
7

如果用户从主页登录,我需要采取特定操作。在我LogOnModel,我有一个隐藏字段:在.NET MVC中,有没有简单的方法来检查我是否在主页上?

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

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

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

任何想法?万分感谢!

回答

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的路线,允许代码是完全自给。

这可能比将控制器名称和操作名称放在那里让世界看到脚本将其推回服务器更清晰。

+0

谢谢!我会给那一枪。我假设当我在主页面(Home/Index)时,它会给我那个价值,但实际的用户URL并不显示它? –

+0

为了获得控制器名称,你必须像这样访问RouteData对象上的Values属性:Request.RequestContext.RouteData.Values [“Controller”] – Rafe

+0

@Rafe谢谢你指出这一点,我甚至没有注意到错误。 – parKing

0

您可以使用

Request.Url.AbsoluteUri 

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

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

我从这个页面,方法:

How to get current page URL in MVC 3

也有另一种答案有可能对你有用。

+0

感谢Gaz-非常赞赏。这是我目前使用的方法。 –

3

您可以通过

string controller = (string)ViewContext.RouteData.Values["controller"]; 
string action = (string)ViewContext.RouteData.Values["action"]; 
string url = Url.Action(action, controller); 

得到当前的URL可以在一个或的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,如果你的路线不断意思更改,您不必更改此代码。

+0

感谢Omar- LogOn发生在: –

5

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

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

容易吗? :)

+1

@ Tohid-感谢上百万,我想这可能是我一直在寻找的。另外,我假设我也可以将“动作”指定为一个值。 –

相关问题