2011-07-20 6 views
20

Tôi vẽ một trình đơn từ một hành động một phần trực tiếp đến việc bố trí, sử dụng "Diện tích =?":T4MVC @ Url.Action (MVC.Controller.Action()) Renders Parameter trong QueryString

@Html.Action(MVC.Menu.Index()) 

này hành động, xác định Menu nào sẽ hiển thị. Ví dụ, một menu công cộng một phần. Trong các partials, tôi cũng đang sử dụng T4MVC để render các liên kết:

<ul id="navHolder"> 
<li class="level1"> 
    <ul class="mainMenu"> 
     <li><b>@Html.ActionLink("Welcome", MVC.Home.Index())</b> 
      ... 

Đối với một số lý do, url đưa ra bởi T4MVC bao gồm "Diện tích =?" Ở cuối:

<ul id="navHolder"> 
    <li class="level1"> 
     <ul class="mainMenu"> 
      <li><b><a href="/home/index?Area=">Welcome</a></b> 
       ... 

Tôi có NO các khu vực trong dự án của tôi và tôi đã biến cài đặt "IncludeAreasToken" thành false. Thật kỳ lạ, điều này chỉ xảy ra nếu tôi hiển thị một phần bằng cách sử dụng "@ Html.Action" - nếu tôi kéo nó thành "@ Html.Partial" thì tham số không được hiển thị và liên kết sẽ sạch và chính xác. (Tôi không muốn hiển thị nó như là một phần mặc dù, vì vậy xin vui lòng không cung cấp đó như là một gợi ý;)

Bất cứ ai ra có chạy vào điều này trước?

Trả lời

10

Có điều gì đó kỳ lạ đang diễn ra ở đây và tôi tự hỏi liệu có một số loại lỗi MVC ở gốc. Ngay cả khi không sử dụng T4MVC, điều này sẽ xảy ra nếu bạn viết:

@Html.ActionLink("Welcome", "Index", "Home", new { Area = "" }, null) 

Trong một cái nhìn bình thường, điều này không tạo ra khu vực không có thật =, trong khi ở một Html.Action gọi nó?. Tôi cần hỏi ai đó trong đội.

Đối với bây giờ, bạn có thể workaround bằng cách xóa dòng này (khoảng dòng 310) trong t4mvc.tt:

<# if (MvcVersion >= 2) { #>result.RouteValueDictionary.Add("Area", area ?? "");<# } #> 
+0

Cảm ơn bạn - điều đó đã giúp ích. –

+0

Tôi chỉ cần thêm một kiểm tra để xem nếu khu vực đã được cung cấp, nếu vậy tôi thêm nó vào từ điển: 'if (! String.IsNullOrWhiteSpace (khu vực)) {result.RouteValueDictionary.Add (" Area ", area ??" ");} ' –

+0

@BradR: vấn đề với thay đổi này là tôi nghĩ rằng nó không phải lúc nào cũng đúng. Khi bạn đang ở trong chế độ xem Vùng và bạn đang cố gắng tạo liên kết đến chế độ xem cấp cao nhất (không phải Khu vực), thì việc chuyển vùng trống là điều chính xác cần thực hiện để 'thoát' khu vực hiện tại. Nhưng với việc kiểm tra của bạn sẽ không xảy ra. –

30

tôi giải quyết vấn đề này một cách rất dễ dàng, đơn giản bằng cách thêm vào tất cả các tuyến mà không phải là trong khu vực đường trống khu vực như sau:

routes.MapRoute(
"Default", 
"{controller}/{action}/{i​d}", 
new { controller = "Home", action = "Index", area = "", id = UrlParameter.Optional }); 
+0

Chỉ cần thử nghiệm điều này và nó có vẻ như giải pháp đơn giản nhất - chỉ cần thêm một diện tích String.Empty đến tuyến mặc định và tất cả các URL tạo ra chính xác. –

+0

Điều đó có hiệu quả, cảm ơn! –

+0

Giải pháp này phù hợp với tôi, rất dễ dàng. –