3

Сейчас я пытаюсь работать вокруг IE6/7 ошибки, которая требует оборачивания </a> закрывающего тега с этим IE отдельным комментарием, чтобы сделать некоторую раскрывающуюся работу меню:Возможно написать метод расширения метода ASP.NET для Html.ActionLink()?

<!--[if IE 7]><!--></a><!--<![endif]--> 

К сожалению, я не может внедрить это непосредственно в мой Посмотреть код страницы, как это:

<%= Html.ActionLink("LinkName<!--[if IE 7]><!--></a><!--<![endif]-->","Action","Controller") %> 

Как Html.ActionLink будет делать безопасные вещи и отфильтровать комментарий, чтобы предотвратить нападение инъекции Javascript. Ладно, круто. Я в порядке с этим. Хорошее дизайнерское решение.

Что бы я хотел сделать, это написать метод расширения для этого, но этот процесс ускользает от меня, поскольку я этого не делал раньше.

Я думал, что это сработает, но Intellisense, похоже, не поднимает этот метод расширения, который я написал.

public static class MyLinkExtensions 
{ 
    public static string ActionLinkIE(this HtmlHelper htmlHelper, 
     string linkText, string actionName, string controllerName) 
    { 
     return LinkExtensions.ActionLink(htmlHelper, linkText, actionName, controllerName). 
      Replace(@"</a>", @"<!--[if IE 7]><!--></a><!--<![endif]-->"); 
    } 
} 

Любые предложения?

EDIT: Имеет ли название класс? (в моем случае я назвал его MyLinkExtensions)

Кроме того, когда мышь над <%= Html.ActionLink() %>, которая уже является методом расширения. Могу ли я продлить метод расширения?

+0

Вы пытались создать приложение? У меня были случаи, когда код считается незаконным (или не отображается в Intellisense), несмотря на то, что он знает, что все в порядке. – ChrisF

+0

Да, я попытался построить его, не повезло. – Pretzel

ответ

6

Вы, вероятно, нужно положить расширения пространства имен в web.config:

<pages>  
     <namespaces> 
     <add namespace="System.Web.Mvc" /> 
     <add namespace="System.Web.Mvc.Html" /> 
     <add namespace="System.Web.Routing" /> 
     <add namespace="System.Linq" /> 
     <add namespace="Pretzel.Extensions.Html" /> 
     </namespaces> 
</pages> 

Это должно помочь Intellisense.

+0

Это было полностью, я бы никогда не подумал об этом без твоей помощи. Спасибо! – Pretzel

+0

Кроме того, вы можете поместить ваши классы расширения в то же пространство имен, что и классы, которые вы расширяете. Например, я помещал расширения в 'HtmlHelper' в' System.Web.Mvc'. Таким образом, пока вы ссылаетесь на библиотеку, методы расширения будут автоматически подбираться. (Это также делает логический смысл, учитывая расширение типа.) – Peter

0

Вы можете изменить библиотеку для кодирования сигнала в соответствии с этой должности от Фила Хаака http://haacked.com/archive/2010/04/06/using-antixss-as-the-default-encoder-for-asp-net.aspx

Это дает возможность использовать ANtiXss http://wpl.codeplex.com/. Это библиотека от Microsoft, которая имеет:

  • JavascriptEncoding
  • Кодирование от белого списка

Практически любое приложение, которое использует Ajax и Javascript будет нуждаться JavascriptEncoding в любом случае, так что я думаю, что нет никаких шансов пойти без этой библиотеки.

Если помощник использует эту библиотеку, вам нужно только добавить свой тег в белый список, и вы готовы к работе.

EDIT

Я только что видел на странице, что это не работает в существующую Html Helper :-(. Ну я держу этот пост до MVC3. Будем надеяться AnTiXss включен, то из коробки.