2008-10-24 34 views
87

Tôi sử dụng một đối tượng ẩn danh để chuyển thuộc tính Html của tôi sang một số phương thức trợ giúp. Nếu người tiêu dùng không thêm thuộc tính ID, tôi muốn thêm thuộc tính đó vào phương thức trợ giúp của tôi.Thêm thuộc tính vào loại ẩn danh sau khi tạo

Làm cách nào để thêm thuộc tính vào đối tượng ẩn danh này?

Trả lời

12

Nếu bạn đang cố gắng mở rộng phương pháp này:

public static MvcHtmlString ActionLink(this HtmlHelper htmlHelper, string linkText, string actionName, object routeValues); 

Mặc dù tôi chắc chắn rằng phần mở rộng đối tượng Khaja của sẽ làm việc, bạn có thể có được hiệu suất tốt hơn bằng cách tạo ra một RouteValueDictionary và đi qua trong đối tượng routeValues , thêm thông số bổ sung của bạn từ ngữ cảnh, sau đó quay trở lại bằng cách sử dụng quá tải ActionLink mất một RouteValueDictionary thay vì một đối tượng:

Điều này cần thực hiện thủ thuật:

public static MvcHtmlString MyLink(this HtmlHelper helper, string linkText, string actionName, object routeValues) 
    { 
     RouteValueDictionary routeValueDictionary = new RouteValueDictionary(routeValues); 

     // Add more parameters 
     foreach (string parameter in helper.ViewContext.RequestContext.HttpContext.Request.QueryString.AllKeys) 
     { 
      routeValueDictionary.Add(parameter, helper.ViewContext.RequestContext.HttpContext.Request.QueryString[parameter]); 
     } 

     return helper.ActionLink(linkText, actionName, routeValueDictionary); 
    } 
+0

Hoạt động như một sự quyến rũ, đây phải là câu trả lời được chấp nhận! BTW: Nếu bạn đang sử dụng quá tải đối tượng của ActionLink() cho đến nay, bạn phải bọc htmlAttributes với HtmlHelper.AnonymousObjectToHtmlAttributes (htmlAttributes) để gọi quá tải chính xác! –

39

Tôi giả sử bạn có nghĩa là các loại ẩn danh ở đây, ví dụ: new { Name1=value1, Name2=value2} vv Nếu vậy, bạn không may mắn - các loại ẩn danh là các kiểu bình thường trong đó chúng là mã được biên dịch, cố định. Họ chỉ xảy ra để được autogenerated.

Điều bạn có thể làm là viết new { old.Name1, old.Name2, ID=myId } nhưng tôi không biết đó có thực sự là điều bạn muốn hay không. Một số chi tiết về tình hình (bao gồm các mẫu mã) sẽ là lý tưởng.

Ngoài ra, bạn có thể tạo đối tượng vùng chứa luôn là có ID và bất kỳ đối tượng nào khác chứa phần còn lại của thuộc tính.

0
public static string TextBox(this HtmlHelper html, string value, string labelText, string textBoxId, object textBoxHtmlAttributes, object labelHtmlAttributes){} 

Điều này sẽ chấp nhận giá trị id mà hộp văn bản phải có và nhãn nên tham chiếu. Nếu người tiêu dùng hiện không bao gồm thuộc tính "id" trong textBoxHtmlAttributes, phương pháp sẽ tạo nhãn không chính xác.

Tôi có thể kiểm tra phản ánh nếu thuộc tính này được thêm vào đối tượng labelHtmlAttributes. Nếu vậy, tôi muốn thêm nó hoặc tạo một đối tượng ẩn danh mới đã được thêm vào. Nhưng vì tôi không thể tạo một loại ẩn danh mới bằng cách đi qua các thuộc tính cũ và thêm thuộc tính "id" của riêng tôi, tôi bị kẹt.

Một vùng chứa có thuộc tính ID được nhập mạnh và sau đó thuộc tính "thuộc tính" được nhập ẩn danh sẽ yêu cầu viết lại mã không cân nhắc đến yêu cầu "thêm trường id".

Hy vọng phản hồi này là dễ hiểu. Đó là ngày cuối cùng, không thể lấy bộ não của tôi xếp hàng nữa ..

+0

Vâng ... bạn * có thể * tạo một loại mới (với CodeDOM vv) chứa các thuộc tính liên quan. Nhưng mã sẽ xấu xí như địa ngục. Tôi có thể đề nghị rằng thay vì lấy một đối tượng và nhìn vào các thuộc tính thông qua sự phản ánh, bạn có một IDictionary hay cái gì đó? (Tiếp theo) –

+0

Bạn có thể xây dựng từ điển đó với một phương thức trợ giúp đã thực hiện toàn bộ điều phản chiếu - và có thể có một phương pháp bao bọc đã làm chính xác điều đó - nhưng một từ điển có vẻ như gần với những gì bạn đang thực sự cố gắng đại diện; khởi tạo đối tượng ẩn danh chỉ là cú pháp thuận tiện. –

68

Lớp mở rộng sau sẽ giúp bạn có được những gì bạn cần.

public static class ObjectExtensions 
{ 
    public static IDictionary<string, object> AddProperty(this object obj, string name, object value) 
    { 
     var dictionary = obj.ToDictionary(); 
     dictionary.Add(name, value); 
     return dictionary; 
    } 

    // helper 
    public static IDictionary<string, object> ToDictionary(this object obj) 
    { 
     IDictionary<string, object> result = new Dictionary<string, object>(); 
     PropertyDescriptorCollection properties = TypeDescriptor.GetProperties(obj); 
     foreach (PropertyDescriptor property in properties){ 
      result.Add(property.Name, property.GetValue(obj)); 
     } 
     return result; 
    } 
} 
+2

100% chính xác.Mặc dù thông thường bạn sử dụng các loại vô danh cho thuộc tính Html, nó thực sự là một IDictionary và do đó bạn có thể thêm/gỡ bỏ dễ dàng từ nó. –

+9

http://msdn.microsoft.com/en-us/library/system.web.mvc.htmlhelper.anonymousobjecttohtmlattributes(v=vs.108).aspx thực hiện điều tương tự nhưng được tích hợp vào System.Web.Mvc. HtmlHelper. – Mir

+1

Tại sao ToDictionary công khai và không riêng tư, nó không có ý nghĩa để vạch trần phương pháp này? –

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