Html Özniteliklerimi bazı yardımcı yöntemlere geçirmek için anonim bir nesne kullanıyorum. Tüketici bir kimlik özelliği eklemediyse, bunu yardımcı yöntemime eklemek istiyorum.
Bu anonim nesneye nasıl öznitelik ekleyebilirim?
Html Özniteliklerimi bazı yardımcı yöntemlere geçirmek için anonim bir nesne kullanıyorum. Tüketici bir kimlik özelliği eklemediyse, bunu yardımcı yöntemime eklemek istiyorum.
Bu anonim nesneye nasıl öznitelik ekleyebilirim?
Yanıtlar:
Bu yöntemi genişletmeye çalışıyorsanız:
public static MvcHtmlString ActionLink(this HtmlHelper htmlHelper, string linkText, string actionName, object routeValues);
Khaja'nın Object uzantılarının çalışacağından emin olsam da, bir RouteValueDictionary oluşturup routeValues nesnesini ileterek daha iyi performans elde edebilir, ek parametrelerinizi Context'ten ekleyebilir, ardından bir nesne yerine RouteValueDictionary alan ActionLink aşırı yüklemesini kullanarak geri dönebilirsiniz:
Bu hile yapmalı:
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);
}
Aşağıdaki uzatma sınıfı size ihtiyacınız olanı verecektir.
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;
}
}
Burada anonim türleri kastettiğinizi varsayıyorum, örn new { Name1=value1, Name2=value2}
. Eğer öyleyse, şansınız kalmaz - anonim türler sabit, derlenmiş kod oldukları için normal türlerdir. Sadece otomatik olarak oluşturuldular.
Ne olabilir yapmak yazma olduğunu new { old.Name1, old.Name2, ID=myId }
ama bu istediğin gerçekten buysa bilmiyorum. Durumla ilgili daha fazla ayrıntı (kod örnekleri dahil) ideal olacaktır.
Alternatif olarak, her zaman bir kimliği olan ve özelliklerin geri kalanını içeren diğer nesneler olan bir konteyner nesnesi oluşturabilirsiniz .
public static string TextBox(this HtmlHelper html, string value, string labelText, string textBoxId, object textBoxHtmlAttributes, object labelHtmlAttributes){}
Bu, metin kutusunun sahip olması gereken ve etiketin başvurması gereken kimlik değerini kabul eder. Tüketici artık textBoxHtmlAttributes'a "id" özelliğini dahil etmezse, yöntem yanlış bir etiket oluşturacaktır.
Bu özniteliğin labelHtmlAttributes nesnesine eklenip eklenmediğini yansıtmayı kontrol edebilirim. Öyleyse, eklemek veya eklenmiş olan yeni bir anonim nesne oluşturmak istiyorum. Ancak eski öznitelikler arasında dolaşıp kendi "id" özniteliğimi ekleyerek yeni bir anonim tür oluşturamadığım için, biraz sıkıştım.
Kesin olarak yazılmış bir kimlik özelliğine ve ardından anonim olarak yazılmış "özniteliklere" sahip bir kap, "kimlik alanı ekle" gereksinimini karşılamayan kodların yeniden yazılmasını gerektirecektir.
Umarım bu yanıt anlaşılırdır. Günün sonu, artık beynimi sıraya sokamıyorum ..