2011-10-14 24 views
12

Tôi cần tạo liên kết sẽ dựa trên tiêu chí tìm kiếm của mình. Ví dụ:Tôi có thể chuyển liên kết mô hình xem tới hành động để tạo tuyến đường không?

localhost/Search?page=2&Location.PostCode=XX&Location.Country=UK&IsEnabled=true 

Tham số trong liên kết này là các giá trị của thuộc tính trong SearchViewModel của tôi.

Lý tưởng nhất là tôi muốn có một cái gì đó trên dòng:

@Html.ActionLink("Search","User", Model.SearchCriteria) 

Đây có phải là hỗ trợ theo mặc định hay tôi cần phải vượt qua tính chất của mô hình quan điểm của tôi vào đối tượng loại RouteValueDictionary và sau đó sử dụng?

Mục tiêu của tôi là viết trình trợ giúp phân trang sẽ tạo số trang và nối thông số tiêu chí tìm kiếm vào liên kết được tạo.

Ví dụ:

@Html.GeneratePageLinks(Model.PagingInfo, x => Url.Action("Index"), Model.SearchCriteria) 

tôi đã kết hợp các giải pháp của bạn với đề nghị từ PRO ASP.NET MVC 3 cuốn sách và đã kết thúc với những điều sau đây:

Helper để tạo liên kết. phần thú vị là tham số pageUrlDelegate mà sau này được sử dụng để gọi Url.Action cho các liên kết tạo:

public static MvcHtmlString PageLinks(this HtmlHelper html, PagingInfoViewModel pagingInfo, 
             Func<int,String> pageUrlDelegate) 
{ 
    StringBuilder result = new StringBuilder(); 
    for (int i = 1; i <= 5; i++) 
    { 
     TagBuilder tagBuilder = new TagBuilder("a");         
     tagBuilder.MergeAttribute("href", pageUrlDelegate(i)); 
     tagBuilder.InnerHtml = i.ToString(); 
     result.Append(tagBuilder.ToString());    
    }    

    return MvcHtmlString.Create(result.ToString()); 
} 

Sau đó, trong mô hình điểm:

@Html.PageLinks(Model.PagingInfo, x => Url.Action("Index","Search", new RouteValueDictionary() 
    { 
      { "Page", x }, 
      { "Criteria.Location.PostCode", Model.Criteria.Location.PostCode }, 
      { "Criteria.Location.Town", Model.Criteria.Location.Town}, 
      { "Criteria.Location.County", Model.Criteria.Location.County} 
    })) 
) 

tôi vẫn không hài lòng với tên thuộc tính trong Strings, nhưng nó sẽ phải làm ngay bây giờ.

Cảm ơn bạn :)

Trả lời

10

Lý tưởng nhất là tôi muốn có một cái gì đó trên dòng:

@Html.ActionLink("Search","User", Model.SearchCriteria)

Thật không may đó là không thể. Bạn sẽ phải vượt qua từng thuộc tính. Bạn thực sự có thể sử dụng sự quá tải mà phải mất một RouteValueDictionary:

@Html.ActionLink(
    "Search", 
    "User", 
    new RouteValueDictionary(new Dictionary<string, object> 
    { 
     { "Location.PostCode", Model.SearchCriteria.PostCode }, 
     { "Location.Country", Model.SearchCriteria.Country }, 
     { "IsEnabled", Model.IsEnabled }, 
    }) 
) 

Tất nhiên nó có thể tốt hơn để viết một helper tùy chỉnh ActionLink để làm điều này:

public static class HtmlExtensions 
{ 
    public static IHtmlString GeneratePageLink(this HtmlHelper<MyViewModel> htmlHelper, string linkText, string action) 
    { 
     var model = htmlHelper.ViewData.Model; 
     var values = new RouteValueDictionary(new Dictionary<string, object> 
     { 
      { "Location.PostCode", model.SearchCriteria.PostCode }, 
      { "Location.Country", model.SearchCriteria.Country }, 
      { "IsEnabled", model.IsEnabled }, 
     }); 
     return htmlHelper.ActionLink(linkText, action, values); 
    } 
} 

và sau đó:

@Html.GeneratePageLink("some page link text", "index") 

Một khả năng khác là chỉ vượt qua id và có hành động điều khiển tìm nạp mô hình và giá trị tương ứng từ bất kỳ nơi nào bạn đã tìm nạp nó ban đầu trong contro hành động ller đã hiển thị chế độ xem này.

+0

Hi Darin, cảm ơn bạn đã trả lời của bạn. Tôi có thể sẽ sử dụng tư vấn thứ hai của bạn và tạo ra một người trợ giúp để tạo các liên kết trang. –

+0

Vui lòng xem chỉnh sửa –

1

Dưới đây là một số mã được lấy từ số Tekpub samples của Steve Sanderson, đó là những gì bạn đang tìm kiếm.Đầu tiên xác định một phương pháp mở rộng trên đối tượng của bạn -

public static RouteValueDictionary DetailsRouteValues(this JobAd jobAd) 
{ 
    return new RouteValueDictionary 
    { 
     { "controller", "Jobs" }, 
     { "action", "Details" }, 
     { "id", jobAd.JobAdId }, 
     { "country", MakeSimpleUrlSegment(jobAd.LocationCountry) }, 
     { "city", MakeSimpleUrlSegment(jobAd.LocationCity) }, 
     { "title", MakeSimpleUrlSegment(jobAd.Title) } 
    }; 
} 

Sau đó gọi Html.RouteLink sử dụng phương pháp đó -

<%= Html.RouteLink(ad.Title, ad.DetailsRouteValues())%> 
+0

Xin chào, cảm ơn bạn vì giải pháp thay thế. Tôi cần phải quyết định xem có đúng để tôi mở rộng tiêu chí tìm kiếm của mình bằng phương thức trả về các giá trị tuyến đường hay không. Tôi thích giữ cho các mô hình xem của tôi nhẹ nhàng. –

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