2010-01-10 29 views
149

Tôi có trang cái được chia sẻ mà tôi đang sử dụng từ 2 khu vực khác nhau trong ứng dụng mvc 2 của tôi. Trang chính có một liên kết hành động hiện đang chỉ định bộ điều khiển và hành động, nhưng tất nhiên liên kết không hoạt động nếu tôi ở sai khu vực. Tôi thấy không có quá tải cho liên kết hành động mà có một tham số khu vực, là nó có thể làm gì?Làm cách nào để chỉ định tên khu vực trong liên kết hành động?

Trả lời

233

đặn nó ra ..

Html.ActionLink("Link Text", "ActionName", "ControllerName", new { Area = "AreaName" }, new{}) 
+1

Có cách tiếp cận tốt này. – Ravia

+16

AH !!! đó là 'mới {} 'phức tạp ở cuối tôi cứ quên bao gồm! –

+3

@ Pure.Krome - vâng. Không có gì trực quan về nó! – Jeremy

77

Something Tôi chạy vào ngay sau này, mà tôi tưởng tượng những người khác có thể chạy vào: Nếu bạn cần liên kết từ bên trong một khu vực để một hành động không trong một khu vực, bạn vẫn cần phải chỉ định Khu vực làm chuỗi trống.

Ví dụ: tôi đã chuyển một số mã MVC vào một khu vực và thấy rằng tôi cần cập nhật url trong trang chính tham chiếu các trang khác trên trang web.

Để xác định một địa chỉ để một cái gì đó không trong một khu vực, sử dụng

Html.ActionLink("home", "Index", new { area = "", controller = "Home" }) 
+4

Đây là một mẹo rất hay! Nhưng nó cho kết quả không mong đợi với MVC 2 .. Chỉnh sửa nhỏ - Html.ActionLink ("home", "Index", new {area = "", controller = "Home"}) –

9

Trong MVC2 cho area="root" làm việc cho tôi như sau

Html.ActionLink("Home", "Index", "Home", new { Area = "root" }, new{}) 
4

Dưới đây là những gì tôi đã đưa ra như một giải pháp để cho phép người dùng liên kết với các hệ thống xác thực được tạo trước.

Mỗi khu vực của tôi có phiên bản của tệp _LoginPartial.cshtml.

Tôi có thể tải ứng dụng để sử dụng một phiên bản duy nhất của tệp, tuy nhiên tôi tiếp tục gặp lỗi khi cố sử dụng một phần đăng nhập duy nhất.

Nó chỉ là một sửa đổi nhỏ đối với phiên bản gốc được tạo ban đầu, nhưng có vẻ như hoạt động tốt khi được sử dụng trong các khu vực cụ thể.

Đây là đoạn mã đó được sử dụng trong tất cả trong số họ:

@if (Request.IsAuthenticated) 
{ 
    <text> 
    Hello, @Html.ActionLink(User.Identity.Name, "Manage", "Account", new { area = "" }, htmlAttributes: new { @class = "username", title = "Manage" })! 
    @using (Html.BeginForm("LogOff", "Account", new { area = "" }, FormMethod.Post, new { id = "logoutForm" })) 
{ 
     @Html.AntiForgeryToken() 
     <a href="javascript:document.getElementById('logoutForm').submit()">Log off</a> 
} 
    </text> 
} 
else 
{ 
    <ul> 
     <li>@Html.ActionLink("Register", "Register", "Account", new { area = "" }, htmlAttributes: new { id = "registerLink" })</li> 
     <li>@Html.ActionLink("Log in", "Login", "Account", new { area = "" }, htmlAttributes: new { id = "loginLink" })</li> 
    </ul> 
} 
+0

Thiết lập rõ ràng 'htmlAttributes:' đã làm việc rất tốt cho việc sử dụng nhiều tham số. –

12

Sử dụng:

Html.ActionLink("Text", "ActionName", "ControllerName", new { Area = "AreaName" }, null) 

Note: tham số thứ 4 là phải vượt qua con đường Values, nếu bạn vượt qua một tham số có sản phẩm nào nó sẽ xem xét cấu trúc gốc và nếu bạn vượt qua giá trị thích hợp, nó sử dụng nó như là khu vực.

Cũng đừng quên sử dụng null hoặc new{} như tham số thứ 5 vì đi qua null hoặc new {} khi tạo liên kết hành động sẽ không quá tải phương pháp (text,action,controller,route data) hoặc (text,action,controller,route data,html attribute) của nó vì vậy sử dụng phương pháp thích hợp

6

Một lừa gọn gàng bạn có thể làm nếu bạn đang sử dụng diện tích rất nhiều trong Chế độ xem, hãy xác định nó là một biến ở trên cùng:

@{ var awesomeArea = new { area = "Awesome" }; } 

@Html.Action("Something", "Somewhere", awesomeArea) 
@Html.ActionLink("Stuff", "FooBar", awesomeArea) 
Các vấn đề liên quan