2010-04-01 11 views
7

Nhìn vào mã của tôi mà tôi tạo ra trong một Xem phần: Có cách đơn giản làm thế nào để tham gia hai giá trị RouteValueDictionary để vượt qua các thông số để Html.ActionLink

  <% foreach (Customer customerInfo in Model.DataRows) {%> 

      <tr> 
       <td> 
        <%=Html.ActionLink(
          customerInfo.FullName 
          , ((string)ViewData["ActionNameForSelectedCustomer"]) 
          , JoinParameters(customerInfo.id, (RouteValueDictionary) ViewData["AdditionalSelectionParameters"]) 
          , null)%> 
       </td> 
       <td> 
        <%=customerInfo.LegalGuardianName %> 
       </td> 
       <td> 
        <%=customerInfo.HomePhone %> 
       </td> 
       <td> 
        <%=customerInfo.CellPhone %> 
       </td> 
      </tr> 
      <%}%> 

Ở đây tôi đang xây dựng bảng đơn giản mà hiển thị chi tiết của khách hàng.

Như bạn có thể thấy, trong mỗi hàng, tôi đang cố tạo một liên kết sẽ chuyển hướng đến một hành động khác.

Hành động đó yêu cầu ID khách hàng và một số thông số bổ sung.

Tham số bổ sung khác nhau cho mỗi trang mà Chế độ xem một phần này đang sử dụng. Vì vậy, tôi quyết định thực hiện các phương thức Hành động để chuyển các tham số bổ sung đó trong cá thể ViewData dưới dạng RouteValueDictionary.

Bây giờ, trên quan điểm tôi có một vấn đề, tôi cần phải vượt qua customerId và RouteValueDictionary cùng nhau vào phương pháp Html.ActionLink. Điều đó làm cho tôi tìm ra cách để kết hợp tất cả các tham số đó thành một đối tượng (hoặc đối tượng hoặc dụ mới RouteValueDictionary)

Vì cách MVC thực hiện, tôi không thể tạo phương thức trong codebehind class (không có codebihind trong MVC) sẽ tham gia các tham số đó.

Vì vậy, tôi đã từng xấu xí cách - chèn mã nội tuyến:

...script runat="server"...

private RouteValueDictionary JoinParameters(int customerId, RouteValueDictionary defaultValues) 
    { 
     RouteValueDictionary routeValueDictionary = new RouteValueDictionary(defaultValues); 

     routeValueDictionary.Add("customerId", customerId); 

     return routeValueDictionary;        
    } 
...script... 

Bằng cách này là rất xấu xí đối với tôi, bởi vì tôi ghét phải sử dụng mã nội tuyến trong Xem phần.

Câu hỏi của tôi là - có cách nào tốt hơn để tôi có thể trộn các thông số được truyền từ hành động (trong ViewData, TempData, khác ...) và tham số từ chế độ xem khi tạo liên kết hành động hay không.

Tôi có thể xây dựng liên kết này theo cách khác không?

Cảm ơn!

Trả lời

2

Có lẽ một cách đơn giản để thực hiện điều này là tạo một phần mở rộng UrlHelper thực hiện điều gì đó tương tự với phương thức JoinParameters của bạn. Một cái gì đó giống như phương pháp dưới đây là tái sử dụng nhiều hơn một chút:

public static RouteValueDictionary AppendRouteValue(this UrlHelper helper, RouteValueDictionary routeValues, string key, object value) 
{ 
    RouteValueDictionary routeValueDictionary = new RouteValueDictionary(routeValues); 
    routeValueDictionary.Add(key, value); 

    return routeValueDictionary; 
} 

Bây giờ hành động của bạn như sẽ là một cái gì đó như:

<%=Html.ActionLink(
    customerInfo.FullName 
    , ((string)ViewData["ActionNameForSelectedCustomer"]) 
    , Url.AppendRouteValue((RouteValueDictionary) ViewData["AdditionalSelectionParameters"], "customerId", customerInfo.id) 
    , null)%> 
9

Viết một phương pháp khuyến nông để merge từ điển nguồn vào đích.

public static class Util 
{ 
    public static RouteValueDictionary Extend(this RouteValueDictionary dest, IEnumerable<KeyValuePair<string, object>> src) 
    { 
     src.ToList().ForEach(x => { dest[x.Key] = x.Value; }); 
     return dest; 
    } 

    public static RouteValueDictionary Merge(this RouteValueDictionary source, IEnumerable<KeyValuePair<string, object>> newData) 
    { 
     return (new RouteValueDictionary(source)).Extend(newData); 
    } 
} 

sử dụng:

Url.Action(actionName, controllerName, destRvd.Extend(srcRvd)); 

Nếu bạn thay vì muốn có một từ điển thứ 3 có chứa các nội dung của hai - Merge sử dụng. Nhưng điều đó kém hiệu quả hơn.Cách tiếp cận này cho phép nhiều hơn hoặc kém hiệu quả chaining các thao tác trộn nếu bạn cần phải hợp nhất hơn 2 từ điển:

Url.Action(actionName, controllerName, destRvd.Extend(srcRvd1).Extend(srcRvd2)); 

hiệu quả hợp nhất 3 từ điển thành một hình mới:

Url.Action(actionName, controllerName, srcRvd1.Merge(srcRvd2).Extend(srcRvd3)); 
5

- bạn có thể hợp nhất hai (hoặc nhiều hơn) RouteValueDictionary các đối tượng với nhau bằng phương thức Union. Microsoft has good example code of the Union method here nhưng Microsoft không thực sự rõ ràng khi nói đến việc sử dụng Liên minh RouteValueDictionary (do đó lý do cho bài đăng của tôi).

Với các lớp học sau ...

public class Student 
{ 
    public int StudentID { get; set; } 
    public string FirstName { get; set; } 
    public string LastNamse { get; set; } 
    public string Email { get; set; } 
    public DateTime DateOfBirth { get; set; } 
} 

public class Address 
{ 
    public string StreetLine1 { get; set; } 
    public string StreetLine2 { get; set; } 
    public string Suburb { get; set; } 
    public string State { get; set; } 
    public string PostCode { get; set; } 
} 

... và một số mẫu mã ...

Student aStudent = new Student(); 
aStudent.StudentID = 1234; 
aStudent.FirstName = "Peter"; 
aStudent.LastNamse = "Wilson"; 
aStudent.Email = "[email protected]"; 
aStudent.DateOfBirth = new DateTime(1969, 12, 31); 

Address homeAddr = new Address(); 
homeAddr.StreetLine1 = "Unit 99, Floor 10"; 
homeAddr.StreetLine2 = "99-199 Example Street"; 
homeAddr.Suburb = "Sydney"; 
homeAddr.State = "NSW"; 
homeAddr.PostCode = "2001"; 

Initialize và thêm KeyValue<string, object> yếu tố để các RouteValueDictionary đối tượng:

RouteValueDictionary routeStudent = new RouteValueDictionary(aStudent); 
RouteValueDictionary routeAddress = new RouteValueDictionary(homeAddr); 

... Hợp nhất hai đối tượng từ điển bằng toán tử Union:

RouteValueDictionary routeCombined = new RouteValueDictionary(routeStudent.Union(routeAddress).ToDictionary(k => k.Key, k => k.Value)); 

Bây giờ bạn có thể vượt qua tuyến đườngBiến tổng hợp cho phương thức thích hợp (chẳng hạn như ActionLink).

@Html.ActionLink("Click to pass routeValues to the RouteAPI", "MyActionName", routeCombined); 

Viết ra để cửa sổ gỡ lỗi ...

foreach (KeyValuePair<string, object> n in routeCombined) 
    System.Diagnostics.Debug.WriteLine(n.Key + ": " + n.Value); 

... sẽ sản xuất như sau:

 
StudentID: 1234 
FirstName: Peter 
LastNamse: Wilson 
Email: [email protected] 
DateOfBirth: 31/12/1969 12:00:00 AM 
StreetLine1: Unit 99, Floor 10 
StreetLine2: 99-199 Example Street 
Suburb: Sydney 
State: NSW 
PostCode: 2001 
+0

câu trả lời xuất sắc. +1. Chào mừng bạn đến với SOF và cảm ơn bài đăng. – JoshYates1980

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