2013-08-22 3 views
0

У меня есть метод расширения, как, что для создания пролета кнопки:HTMLString MVC 4 расширения цепной метод

public static HtmlString Ext1(this HtmlHelper helper, string css) 
{ 
    var tag = new TagBuilder("span"); 

    tag.AddCssClass(css); 
    ... 
    return new HtmlString(tag.ToString()); 
} 

Я создал другое расширение, чтобы добавить атрибуты к HTMLString ... Как что:

public static HtmlString Ext2(this HtmlString helper, string attr) 
{ 
    // need add attr to HtmlString and return 
    return new HtmlString(newHtmlGenerated); 
} 

Использование @Html.Ext1("class1").Ext2("1234") должно создать пролет с css и attr ...

Как я могу это сделать?

Благодаря

+1

Что вы на самом деле пытаетесь достичь? Это не ясно из вашего вопроса. Вы не можете передать строку html в конструктор 'TagBuilder' - он принимает только имя тега – levelnis

+0

Отредактировал вопрос ... – Paul

ответ

1

Как @levelnis сказал, вы не можете создать TagBuilder из Html, вы можете создать его только от имени тега. Вы должны использовать что-то, что будет анализировать Html обратно в конкретный тип, который позволит вам получить доступ к attitutes. XDocument сделают это красиво. Попробуйте изменить метод Ext2 к этому:

public static HtmlString Ext2(this HtmlString helper, string attr) 
{ 
    var doc = XDocument.Parse(helper.ToHtmlString()); 
    doc.Element(doc.Root.Name).SetAttributeValue("test", attr); 
    return new HtmlString(doc.ToString()); 
} 

XDocument находится в System.Xml.Linq пространстве имен.

+0

Спасибо, любой способ превратить этот метод, независимо от имени тега« span »? – Paul

+0

Просто обновил мой ответ, поэтому «span» больше не жестко закодирован. Предполагается, что добавленный вами атрибут находится на корневом узле, но я думаю, что это сработает для вас. Вероятно, вы также захотите добавить дополнительный параметр для имени атрибута, чтобы он также не был жестко закодирован. – asymptoticFault

Смежные вопросы