C# 在.NETMVC中,是否有一种简单的方法来检查I';我在主页上吗?

C# 在.NETMVC中,是否有一种简单的方法来检查I';我在主页上吗?,c#,asp.net-mvc,razor,C#,Asp.net Mvc,Razor,如果用户从主页登录,我需要执行特定操作。在我的LogOnModel中,我有一个隐藏字段: @Html.Hidden("returnUrl", Request.Url.AbsoluteUri) 在我的控制器中,我需要检查该值是否为主页。在下面的示例中,我正在检查用户是否位于特定页面(“帐户/重置密码”)。有没有一种方法可以不借助正则表达式检查它们是否在主页上 [HttpPost] public ActionResult LogOnInt(LogOnModel model)

如果用户从主页登录,我需要执行特定操作。在我的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")});
       }

有什么想法吗?万分感谢

您可以使用

  Request.Url.AbsoluteUri
然后只需检查页面名称的字符串

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

我从本页获得了该方法:


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

一种方法是在
路由数据中查找特定的控制器。假设您用于主页的控制器称为“HomeController”,则请求的
RoutedData
将包含键“controller”的值“home”

它看起来像这样:

而不是(或者如果您有其他原因,则除此之外):

你应该:

 @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()

更新

通过将referer url(
Request.urlreferer.AbsoluteUri
)映射到路由,还可以消除对隐藏字段的需要(从而减少应用程序中每个页面的总页面重量)。这里有一篇关于这个的帖子

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


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

您可以通过

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,这意味着如果您的路由发生更改,您将不必更改此代码。

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

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

这够容易吗?:)

谢谢Gaz-非常感谢。这就是我目前使用的方法。谢谢!我要试一试。我假设当我在主页(主页/索引)上时,它会给我这个值,尽管实际的用户URL没有显示它?要获取控制器名称,您必须访问RoutedData对象上的Values属性,如下所示:Request.RequestContext.RoutedData.Values[“controller”]@Rafe感谢您指出这一点,我甚至没有注意到这个错误。@Hairgami_Master假设您有一个名为“HomeController”的控制器和一个名为“Index”的操作,RouteData。值[“controller”]只会返回“Home”,但是,您可以使用RouteData访问该操作。值[“action”]感谢Omar-登录通过:@Tohid-感谢一百万,我想那可能就是我想要的。另外,我假设我也可以将“action”指定为一个值。
@ViewContext.Controller.ValueProvider.GetValue("controller").RawValue.ToString()