2012-06-27 32 views
7

Tôi cần thực hiện một hành động cụ thể nếu người dùng đăng nhập từ trang chủ. Trong LogOnModel của tôi, tôi có một trường ẩn:Trong .NET MVC, có cách nào dễ dàng để kiểm tra xem tôi có đang ở trang chủ không?

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

Trong Bộ điều khiển, tôi cần kiểm tra xem giá trị đó có phải là Trang chủ hay không. Trong ví dụ bên dưới, tôi đang kiểm tra xem liệu người dùng có đang ở trên một trang cụ thể không ("Tài khoản/ResetPassword"). Có cách nào để kiểm tra xem họ có đang ở trên trang chủ mà không sử dụng các cụm từ thông dụng không?

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

Bất kỳ ý tưởng nào? Cảm ơn rất rất nhiều!

Trả lời

7

Một cách để tiếp cận điều này là tìm bộ điều khiển cụ thể trong số RouteData. Giả sử rằng bộ điều khiển bạn đang sử dụng cho trang chủ được gọi là "HomeController", thì yêu cầu RouteData cho yêu cầu sẽ chứa giá trị "Home" cho khóa "Controller".

Nó sẽ giống như thế này:

thay vì (hoặc bổ sung cho nếu bạn có lý do khác cho nó):

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

bạn sẽ phải:

@Html.Hidden("referrer", Request.RequestContext.RouteData.Values['Controller']) 

và bộ điều khiển của bạn sẽ trông giống như:

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

Điều này sẽ loại bỏ nhu cầu sử dụng .Contains()

Cập nhật:

Bạn cũng có thể loại bỏ sự cần thiết cho một lĩnh vực ẩn (và do đó làm giảm tổng thể trang trọng cho những gì có vẻ như tất cả các trang trong ứng dụng của bạn) bằng cách ánh xạ url liên kết giới thiệu (Request.UrlReferrer.AbsoluteUri) đến một tuyến đường. Có một bài viết về điều đó ở đây.

How to get RouteData by URL?

Ý tưởng sẽ được sử dụng động cơ MVC để ánh xạ một url giới thiệu vào một con đường MVC trong phương pháp LogOnInt, cho phép mã được hoàn toàn khép kín.

Điều này có lẽ sẽ sạch hơn việc đặt tên bộ điều khiển và tên hành động ra khỏi đó để cả thế giới cùng xem với kịch bản để đẩy nó trở lại máy chủ.

+0

cảm ơn! Tôi sẽ cho rằng một shot. Tôi giả sử khi tôi đang ở trên trang chính (Trang chủ/Chỉ mục), nó sẽ cho tôi giá trị đó, mặc dù URL người dùng thực tế không hiển thị nó? –

+0

Để lấy tên bộ điều khiển, bạn sẽ phải truy cập thuộc tính Giá trị trên đối tượng RouteData như sau: Request.RequestContext.RouteData.Values ​​["Controller"] – Rafe

+0

@Rafe cảm ơn vì đã chỉ ra điều đó, tôi thậm chí còn không nhận thấy rằng sai lầm. – parKing

0

Bạn có thể sử dụng

Request.Url.AbsoluteUri 

Sau đó chỉ cần kiểm tra các chuỗi cho tên trang.

Có thể không phải là cách tốt nhất, nhưng là cách nhanh chóng và dễ dàng.

tôi đã nhận rằng phương pháp từ trang này:

How to get current page URL in MVC 3

Ngoài ra còn có một câu trả lời đó mà có thể hữu ích cho bạn.

+0

Cảm ơn Gaz- được đánh giá cao. Đó là cách tiếp cận hiện tại tôi đang sử dụng. –

3

Bạn có thể lấy URL hiện qua

string controller = (string)ViewContext.RouteData.Values["controller"]; 
string action = (string)ViewContext.RouteData.Values["action"]; 
string url = Url.Action(action, controller); 

Bạn có thể làm điều này trong một HtmlHelper hoặc trong bộ điều khiển mà ám quan điểm đăng nhập.

cửa hàng url trong một lĩnh vực tiềm ẩn như bạn đã làm, sau đó trong bài hành động của bạn:

[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")}); 
    } 
} 

Lợi ích của việc sử dụng Url.Action là nó sẽ sử dụng bảng định tuyến của bạn để tạo ra các URL, có nghĩa là nếu các tuyến đường của bạn bao giờ thay đổi, bạn sẽ không phải thay đổi mã này.

+0

Cảm ơn Omar- The LogOn diễn ra thông qua: –

5

Trong bất kỳ chế độ xem nào, mã sau trả về tên bộ điều khiển hiện tại.

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

Có dễ dàng không? :)

+1

@ Tohid- ​​cảm ơn một triệu, tôi nghĩ rằng đó có thể là những gì tôi đang tìm kiếm. Ngoài ra, tôi giả sử tôi cũng có thể chỉ định "hành động" làm giá trị. –

Các vấn đề liên quan