익명 개체를 사용하여 HTML 특성을 일부 도우미 메서드에 전달했습니다. 소비자가 ID 속성을 추가하지 않은 경우 도우미 메소드에 추가하려고합니다.생성 후 익명 형식에 속성 추가
이 익명 개체에 특성을 추가하려면 어떻게해야합니까?
익명 개체를 사용하여 HTML 특성을 일부 도우미 메서드에 전달했습니다. 소비자가 ID 속성을 추가하지 않은 경우 도우미 메소드에 추가하려고합니다.생성 후 익명 형식에 속성 추가
이 익명 개체에 특성을 추가하려면 어떻게해야합니까?
이 방법 확장하려는 경우 : 나는 확신하지만
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);
}
여기서 익명 형식을 사용한다고 가정합니다. new { Name1=value1, Name2=value2}
등입니다. 그렇다면 운이 좋지 않습니다. 익명의 유형은 고정 된 컴파일 된 코드라는 일반적인 유형입니다. 그들은 단지 자동 생성 될 수 있습니다.
은 일 수 있습니까? 쓰기는 new { old.Name1, old.Name2, ID=myId }
이지만 실제로 원하는지는 알 수 없습니다. 상황에 대한 자세한 내용 (코드 샘플 포함)이 이상적입니다.
또는 항상에 ID가 있고 다른 개체에 나머지 속성이 포함 된 컨테이너 개체를 만들 수 있습니다.
public static string TextBox(this HtmlHelper html, string value, string labelText, string textBoxId, object textBoxHtmlAttributes, object labelHtmlAttributes){}
텍스트 상자에 있어야하며 레이블이 참조해야하는 id 값을 허용합니다. 소비자가 textBoxHtmlAttributes에 "id"속성을 포함하지 않으면이 메서드는 잘못된 라벨을 만듭니다.
이 속성이 labelHtmlAttributes 객체에 추가되었는지 여부를 반영하여 확인할 수 있습니다. 그렇다면 추가하거나 추가 한 새로운 익명 개체를 만들고 싶습니다. 그러나 이전 특성을 살펴보고 내 자신의 "id"특성을 추가하여 새로운 익명 형식을 만들 수 없기 때문에 나는 꼼짝 할 수 없습니다.
강력하게 유형이 지정된 ID 속성과 익명의 "특성"속성이있는 컨테이너의 경우 "id 필드 추가"요구 사항에 맞지 않는 코드 재 작성이 필요합니다.
희망이 응답을 이해할 수 있습니다. 오늘이 끝나면 내 뇌를 더 이상 얻을 수 없습니다.
음 ... * 관련 속성이 포함 된 새로운 유형 (CodeDOM 등)을 만들 수 있습니다. 그러나 코드는 지옥처럼 추악 할 것입니다. 객체를 가져 와서 리플렉션을 통해 속성을 보는 대신 IDictionary
전체 사전 작업을 수행하는 도우미 메서드로 사전을 구성 할 수 있습니다. 그리고 정확하게 그렇게하는 래퍼 메서드를 가질 수 있습니다. 그러나 사전은 실제로 표현하려고하는 것과 더 가깝게 들리는 것처럼 들립니다. 익명 객체 이니셜 라이저는 구문 상으로 편리합니다. –
다음 확장 클래스를 사용하면 필요한 것을 얻을 수 있습니다.
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;
}
}
100 % 정확함.일반적으로 익명 형식을 Html 특성에 사용하더라도 실제로는 IDictionary <문자열, 개체>이므로 쉽게 추가하거나 제거 할 수 있습니다. –
http://msdn.microsoft.com/en-us/library/system.web.mvc.htmlhelper.anonymousobjecttohtmlattributes(v=vs.108).aspx는 동일한 작업을 수행하지만 System.Web.Mvc에 내장되어 있습니다. HtmlHelper. – Mir
ToDictionary가 공개이고 비공개가 아닌 이유는 무엇입니까?이 방법을 공개하는 것은 의미가 있습니까? –
매력처럼 작동합니다. 허용 된 답변이어야합니다! BTW : 지금까지 ActionLink()의 객체 오버로드를 사용하고 있다면 올바른 오버로드를 호출하기 위해 htmlAttributes를 HtmlHelper.AnonymousObjectToHtmlAttributes (htmlAttributes)로 래핑해야합니다! –