Правильно сделать расширение ActionLink с помощью htmlAttributes - PullRequest
1 голос
/ 07 марта 2012

Я использую собственное расширение для моих ссылок ActionLink. Я добавил атрибут data_url, который должен быть переведен в атрибут data-url. Это замена знака подчеркивания тире.

Вот ссылка 1, использующая мое собственное расширение:

@Ajax.ActionLink("Add", MyRoutes.GetAdd(), new AjaxOptions()
    , new { data_url = Url.Action(...)})

Результат: data_url

Вот ссылка 2 с использованием фреймворка ActionLink:

@Ajax.ActionLink("Add 2", "x", "x", null, new AjaxOptions()
    , new { data_url = Url.Action(...) })

Результат: data-url

Вот расширение, достаточно простое, , за исключением того, что единственный способ пропустить htmlAttributes, о котором я знаю, это использовать расширение ToDictionaryR(). Я подозреваю, что это проблема, поэтому мне интересно, стоит ли мне использовать что-то еще. Я также предоставил это расширение ниже.

public static MvcHtmlString ActionLink(this AjaxHelper helper, string linkText
        , RouteValueDictionary routeValues, AjaxOptions ajaxOptions
        , object htmlAttributes = null)
{
    return helper.ActionLink(linkText, routeValues["Action"].ToString()
        , routeValues["Controller"].ToString(), routeValues, ajaxOptions
        , (htmlAttributes == null ? null : htmlAttributes.ToDictionaryR()));
}

public static IDictionary<string, object> ToDictionaryR(this object obj)
{
    return TurnObjectIntoDictionary(obj);
}
public static IDictionary<string, object> TurnObjectIntoDictionary(object data)
{
    var attr = BindingFlags.Public | BindingFlags.Instance;
    var dict = new Dictionary<string, object>();
    foreach (var property in data.GetType().GetProperties(attr))
    {
        if (property.CanRead)
        {
            dict.Add(property.Name, property.GetValue(data, null));
        }
    }
    return dict;
}

спасибо

1 Ответ

3 голосов
/ 07 марта 2012

Вы можете использовать AnonymousObjectToHtmlAttributes метод, который делает именно то, что вы хотите, и вам не нужны никакие пользовательские методы расширения:

public static MvcHtmlString ActionLink(
    this AjaxHelper helper, 
    string linkText, 
    RouteValueDictionary routeValues, 
    AjaxOptions ajaxOptions, 
    object htmlAttributes = null
)
{
    return helper.ActionLink(
        linkText,    
        routeValues["Action"].ToString(), 
        routeValues["Controller"].ToString(), 
        routeValues, 
        ajaxOptions, 
        htmlAttributes == null ? null : HtmlHelper.AnonymousObjectToHtmlAttributes(htmlAttributes)
    );
}
...