Saya menggunakan objek anonim untuk meneruskan Atribut Html saya ke beberapa metode pembantu. Jika konsumen tidak menambahkan atribut ID, saya ingin menambahkannya di metode helper saya.
Bagaimana cara menambahkan atribut ke objek anonim ini?
Saya menggunakan objek anonim untuk meneruskan Atribut Html saya ke beberapa metode pembantu. Jika konsumen tidak menambahkan atribut ID, saya ingin menambahkannya di metode helper saya.
Bagaimana cara menambahkan atribut ke objek anonim ini?
Jawaban:
Jika Anda mencoba memperluas metode ini:
public static MvcHtmlString ActionLink(this HtmlHelper htmlHelper, string linkText, string actionName, object routeValues);
Meskipun saya yakin ekstensi Object Khaja akan berfungsi, Anda mungkin mendapatkan kinerja yang lebih baik dengan membuat RouteValueDictionary dan meneruskan objek routeValues, tambahkan parameter tambahan Anda dari Context, lalu kembali menggunakan overload ActionLink yang mengambil RouteValueDictionary alih-alih objek:
Ini harus melakukan trik:
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);
}
Kelas ekstensi berikut akan memberi Anda apa yang Anda butuhkan.
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;
}
}
Saya berasumsi yang Anda maksud adalah tipe anonim di sini, misalnya, new { Name1=value1, Name2=value2}
dll. Jika demikian, Anda kurang beruntung - tipe anonim adalah tipe normal karena mereka tetap, kode terkompilasi. Mereka kebetulan dibuat secara otomatis.
Apa yang dapat Anda lakukan adalah menulis new { old.Name1, old.Name2, ID=myId }
tetapi saya tidak tahu apakah itu yang Anda inginkan. Beberapa detail lebih lanjut tentang situasi (termasuk contoh kode) akan ideal.
Alternatifnya, Anda bisa membuat objek kontainer yang selalu memiliki ID dan objek lain apa pun yang berisi properti lainnya.
public static string TextBox(this HtmlHelper html, string value, string labelText, string textBoxId, object textBoxHtmlAttributes, object labelHtmlAttributes){}
Ini akan menerima nilai id yang seharusnya dimiliki kotak teks dan label yang harus dirujuk. Jika konsumen sekarang tidak menyertakan properti "id" di textBoxHtmlAttributes, metode ini akan membuat label yang salah.
Saya dapat memeriksa melalui refleksi jika atribut ini ditambahkan di objek labelHtmlAttributes. Jika demikian, saya ingin menambahkannya atau membuat objek anonim baru yang telah ditambahkannya. Tetapi karena saya tidak dapat membuat tipe anonim baru dengan menelusuri atribut lama dan menambahkan atribut "id" saya sendiri, saya agak macet.
Sebuah penampung dengan properti ID yang diketik dengan kuat dan kemudian properti "atribut" yang diketik secara anonim akan memerlukan penulisan ulang kode yang tidak membebani persyaratan "tambahkan bidang id".
Semoga tanggapan ini bisa dimengerti. Ini akhir hari, tidak bisa otak saya sejalan lagi ..