11

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

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

在我的控制器中,我需要检查该值是否是主页。在下面的示例中,我正在检查用户是否在特定页面上(“帐户/重置密码”)。有没有办法在不使用正则表达式的情况下检查它们是否在主页上?

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

有任何想法吗?一百万谢谢!

4

4 回答 4

8

解决此问题的一种方法是在RouteData. 假设您用于主页的控制器称为“HomeController”,则RouteData请求的“控制器”键将包含值“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您还可以通过将引荐来源网址 ( ) 映射到路由来消除对隐藏字段的需求(从而减少应用程序中每个页面的整体页面重量)。这里有一篇关于这个的帖子。

如何通过 URL 获取 RouteData?

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

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

于 2012-06-27T21:00:52.887 回答
5

您可以通过以下方式获取当前 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,这意味着如果您的路由发生变化,您将不必更改此代码。

于 2012-06-27T21:12:50.633 回答
5

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

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

够容易吗?:)

于 2012-06-27T21:17:20.710 回答
0

你可以使用

  Request.Url.AbsoluteUri

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

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

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

如何在 MVC 3 中获取当前页面 URL

那里还有另一个可能对您有用的答案。

于 2012-06-27T18:37:01.667 回答