Thêm thuộc tính vào loại ẩn danh sau khi tạo


101

Tôi sử dụng một đối tượng ẩn danh để chuyển các Thuộc tính Html của tôi tới 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 mình.

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

Câu trả lời:


17

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 của Khaja sẽ hoạt động, bạn có thể đạt được hiệu suất tốt hơn bằng cách tạo một RouteValueDictionary và chuyển vào đối tượng routeValues, thêm các tham số bổ sung của bạn từ Context, sau đó quay lại bằng cách sử dụng quá tải ActionLink lấy một RouteValueDictionary thay vì một đối tượng:

Cái này cần phải dùng mẹo:

    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);
    }

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 kết hợp htmlAttributes với HtmlHelper.AnonymousObjectToHtmlAttributes (htmlAttributes) để gọi đúng quá tải!
DR

79

Lớp mở rộng sau đây 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;
    }
}

4
Đúng 100%. Mặc dù nói chung bạn sử dụng các kiểu ẩn danh cho Thuộc tính Html, nhưng nó thực sự là một IDictionary <string, object> và do đó bạn có thể thêm / xóa dễ dàng khỏi nó.
Peter Munnings

12
msdn.microsoft.com/en-us/library/… làm điều tương tự, nhưng nó được tích hợp vào System.Web.Mvc.HtmlHelper.
Mir

1
Tại sao ToDictionary là public chứ không phải private, không có ý nghĩa gì khi để lộ phương thức này?
Giáo sư lập trình

52

Tôi cho rằng bạn muốn nói đến các loại ẩn danh ở đây, ví dụ, new { Name1=value1, Name2=value2}v.v. Nếu vậy, bạn không gặp may - các loại ẩn danh là các loại bình thường mà chúng là mã được biên dịch, cố định. Chúng chỉ tình cờ được tạo tự động.

Những gì 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 hơn về tình hình (bao gồm cả các mẫu mã) sẽ là lý tưởng.

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


-1
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 phải tham chiếu đến. 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 này sẽ tạo ra một nhãn không chính xác.

Tôi có thể kiểm tra thông qua phản chiếu 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 bởi vì tôi không thể tạo một loại ẩn danh mới bằng cách xem qua các thuộc tính cũ và thêm thuộc tính "id" của riêng mình, nên tôi hơi bị mắc kẹt.

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

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


Chà ... bạn có thể tạo một kiểu mới (với CodeDOM, v.v.) có chứa các thuộc tính liên quan. Nhưng mã sẽ xấu như địa ngục. Tôi có thể gợi ý rằng thay vì lấy một đối tượng và xem xét các thuộc tính thông qua phản chiếu, bạn lấy một IDictionary <string, string> hoặc một cái gì đó không? (Còn tiếp)
Jon Skeet

Bạn có thể xây dựng từ điển đó bằng một phương thức trợ giúp đã phản ánh toàn bộ điều đó - và có thể có một phương thức trình bao bọc làm chính xác điều đó - nhưng một từ điển có vẻ như nó gần với những gì bạn thực sự đang cố gắng trình bày; các trình khởi tạo đối tượng ẩn danh chỉ tiện dụng về mặt cú pháp.
Jon Skeet
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.