我需要,如果用户从主页登录采取特定的行动。 在我LogOnModel,我有一个隐藏字段:
@Html.Hidden("returnUrl", Request.Url.AbsoluteUri)
在我的控制,我需要检查,如果该值是主页或没有。 在下面的例子中,我检查,看看用户是一个特定页面(“帐号/ ResetPassword”)上。 有没有一种方法来检查,看看他们的主页上,而不诉诸正则表达式?
[HttpPost]
public ActionResult LogOnInt(LogOnModel model)
{
if (model.returnUrl.Contains("/Account/ResetPassword"))
{
return Json(new { redirectToUrl = @Url.Action("Index","Home")});
}
有任何想法吗? 数以百万计的感谢!
接近这一点的一种方法是寻找在特定的控制器RouteData
。 假设你正在使用的主页的控制器被称为“HomeController的”,那么RouteData
的请求将包含值“家”为重点的“控制器”。
这将是这个样子:
代替(或补充,如果你有其他的原因吧):
@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
)的路线。 有一个关于这张贴在这里。
如何通过URL获得的RouteData?
这个想法是使用MVC引擎参照网址映射到一个MVC路线LogOnInt
方法,使代码是完全自给。
这很可能是不是把控制器名称和动作的名字在那里清洁的世界,看看随着脚本推回给服务器。
在任何视图中,以下代码返回当前控制器名称。
@ViewContext.Controller.ValueProvider.GetValue("controller").RawValue.ToString()
它是很容易的? :)
您可以通过获取当前URL
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,这意味着如果你的路线不断改变,你将不必更改此代码。