[英]In .NET MVC, is there an easy way to check if I'm on the home page?
如果用戶從主頁登錄,我需要采取特定操作。 在我的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")});
}
有任何想法嗎? 一百萬謝謝!
解決這個問題的一種方法是在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()
的需要。
更新 :
您還可以通過將引用URL( Request.UrlReferrer.AbsoluteUri
)映射到路由來消除對隱藏字段的需求(從而減少應用程序中每個頁面的整體頁面權重)。 這里有一篇關於此的帖子。
我們的想法是使用mvc引擎將引用者URL映射到LogOnInt
方法中的MVC路由,從而允許代碼完全自包含。
這可能比把控制器名稱和操作名稱放在那里更干凈,讓全世界都可以看到腳本將其推回服務器。
在任何視圖中,以下代碼返回當前控制器名稱。
@ViewContext.Controller.ValueProvider.GetValue("controller").RawValue.ToString()
這很容易嗎? :)
您可以通過獲取當前網址
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,這意味着如果您的路由發生變化,您將不必更改此代碼。
你可以使用
Request.Url.AbsoluteUri
然后只需檢查字符串中的頁面名稱。
可能不是最好的方式,但它是一種快速簡便的方法。
我從這個頁面得到了這個方法:
還有另一個答案可能對您有用。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.