2008-10-24 3 views
87

익명 개체를 사용하여 HTML 특성을 일부 도우미 메서드에 전달했습니다. 소비자가 ID 속성을 추가하지 않은 경우 도우미 메소드에 추가하려고합니다.생성 후 익명 형식에 속성 추가

이 익명 개체에 특성을 추가하려면 어떻게해야합니까?

답변

12

이 방법 확장하려는 경우 : 나는 확신하지만

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

이 Khaja의 개체 확장 당신은 RouteValueDictionary를 만들고 routeValues ​​개체를 전달하여 더 나은 성능을 얻을 수 있습니다 작동 것을 Context에서 추가 매개 변수를 추가 한 다음 객체 대신 RouteValueDictionary를 사용하는 ActionLink 오버로드를 사용하여 반환하십시오.

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

매력처럼 작동합니다. 허용 된 답변이어야합니다! BTW : 지금까지 ActionLink()의 ​​객체 오버로드를 사용하고 있다면 올바른 오버로드를 호출하기 위해 htmlAttributes를 HtmlHelper.AnonymousObjectToHtmlAttributes (htmlAttributes)로 래핑해야합니다! –

39

여기서 익명 형식을 사용한다고 가정합니다. new { Name1=value1, Name2=value2} 등입니다. 그렇다면 운이 좋지 않습니다. 익명의 유형은 고정 된 컴파일 된 코드라는 일반적인 유형입니다. 그들은 단지 자동 생성 될 수 있습니다.

일 수 있습니까? 쓰기는 new { old.Name1, old.Name2, ID=myId }이지만 실제로 원하는지는 알 수 없습니다. 상황에 대한 자세한 내용 (코드 샘플 포함)이 이상적입니다.

또는 항상에 ID가 있고 다른 개체에 나머지 속성이 포함 된 컨테이너 개체를 만들 수 있습니다.

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

텍스트 상자에 있어야하며 레이블이 참조해야하는 id 값을 허용합니다. 소비자가 textBoxHtmlAttributes에 "id"속성을 포함하지 않으면이 메서드는 잘못된 라벨을 만듭니다.

이 속성이 labelHtmlAttributes 객체에 추가되었는지 여부를 반영하여 확인할 수 있습니다. 그렇다면 추가하거나 추가 한 새로운 익명 개체를 만들고 싶습니다. 그러나 이전 특성을 살펴보고 내 자신의 "id"특성을 추가하여 새로운 익명 형식을 만들 수 없기 때문에 나는 꼼짝 할 수 없습니다.

강력하게 유형이 지정된 ID 속성과 익명의 "특성"속성이있는 컨테이너의 경우 "id 필드 추가"요구 사항에 맞지 않는 코드 재 작성이 필요합니다.

희망이 응답을 이해할 수 있습니다. 오늘이 끝나면 내 뇌를 더 이상 얻을 수 없습니다.

+0

음 ... * 관련 속성이 포함 된 새로운 유형 (CodeDOM 등)을 만들 수 있습니다. 그러나 코드는 지옥처럼 추악 할 것입니다. 객체를 가져 와서 리플렉션을 통해 속성을 보는 대신 IDictionary 또는 뭔가를 취할 것을 제안 할 수 있습니까? (계속) –

+0

전체 사전 작업을 수행하는 도우미 메서드로 사전을 구성 할 수 있습니다. 그리고 정확하게 그렇게하는 래퍼 메서드를 가질 수 있습니다. 그러나 사전은 실제로 표현하려고하는 것과 더 가깝게 들리는 것처럼 들립니다. 익명 객체 이니셜 라이저는 구문 상으로 편리합니다. –

68

다음 확장 클래스를 사용하면 필요한 것을 얻을 수 있습니다.

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 % 정확함.일반적으로 익명 형식을 Html 특성에 사용하더라도 실제로는 IDictionary <문자열, 개체>이므로 쉽게 추가하거나 제거 할 수 있습니다. –

+9

http://msdn.microsoft.com/en-us/library/system.web.mvc.htmlhelper.anonymousobjecttohtmlattributes(v=vs.108).aspx는 동일한 작업을 수행하지만 System.Web.Mvc에 내장되어 있습니다. HtmlHelper. – Mir

+1

ToDictionary가 공개이고 비공개가 아닌 이유는 무엇입니까?이 방법을 공개하는 것은 의미가 있습니까? –

관련 문제