如果用户从主页登录,我需要采取特定操作。在我的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")});
}
有什么想法吗?一百万谢谢!
答案 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
)映射到路由来消除对隐藏字段的需求(从而降低应用程序中每个页面的整体页面权重)。这里有一篇关于此的帖子。
我们的想法是使用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
还有另一个答案可能对你有用。