回答:
このメソッドを拡張しようとしている場合:
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);
}
次の拡張クラスは、必要なものを取得します。
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;
}
}
public static string TextBox(this HtmlHelper html, string value, string labelText, string textBoxId, object textBoxHtmlAttributes, object labelHtmlAttributes){}
これは、テキストボックスとラベルが参照するID値を受け入れます。コンシューマーがtextBoxHtmlAttributesに「id」プロパティを含めない場合、メソッドは誤ったラベルを作成します。
この属性がlabelHtmlAttributesオブジェクトに追加されているかどうかをリフレクションで確認できます。もしそうなら、それを追加するか、それを追加した新しい匿名オブジェクトを作成します。しかし、古い属性を調べて独自の「id」属性を追加することで新しい匿名型を作成することができないので、ちょっと行き詰まっています。
厳密に型指定されたIDプロパティと、その後に匿名で型指定された「属性」プロパティを持つコンテナでは、「IDフィールドの追加」の要件を満たさないコードの書き換えが必要になります。
この反応が理解できることを願っています。一日の終わりです。もう頭がおかしくなりません。