MVC3 HtmlHelper возвращает

#asp.net-mvc-3 #html-helper #html-entities

#asp.net-mvc-3 #html-помощник #html-сущности

Вопрос:

Как я могу заставить MVC3 Html helper возвращать строку, которая не закодирована в html?

Следующий метод:

     public static string SelectedIfEqual(this int id, int otherId)
    {

        if (id == otherId)
            return new MvcHtmlString(" selected='selected'").ToString();
        return null;  

    }
 

возвращает selected=amp;#39;selectedamp;#39; вместо selected='selected' .

Я даже пытался:

     return MvcHtmlString.Create(" selected='selected'").ToHtmlString();
 

но он возвращает то же самое … 🙁

Ответ №1:

Возвращает HtmlString или передает результат Html.Raw() вызову.
Измените вашу функцию на:

 public static MvcHtmlString SelectedIfEqual(this int id, int otherId)
{
  if (id == otherId)
    return new MvcHtmlString(" selected='selected'");
  return null;  
}
 

Если вы не хотите изменять свой код, добавьте расширение в HtmlHelper :

 public static class MyHelper
{
  // This doesn't work
  //public static Foo Grid(this HtmlHelper helper, string id)
  //{
  //  return new Foo(id).ToString();
  //}

  // This should work as intended
  public static MvcHtmlString Foo(this HtmlHelper helper, Foo theFoo)
  {
    return theFoo.ToHtmlString();
  }
}
 

В классе Foo ToHtmlString() метод будет выглядеть следующим образом

 public MvcHtmlString ToHtmlString() 
{
  return new MvcHtmlString(ToString());
}
 

И затем в представлении, которое вы можете использовать

 @Html.Foo(theFoo)
 

Если вы не хотите использовать помощник по расширению, вы также можете использовать:

 @Html.Raw(Model.idField.SelectIfEqual(otherId))
 

Надеюсь, это поможет.

Комментарии:

1. Вы имеете в виду: вернуть новую строку HtmlString(«selected=’selected'»). toString();

2. Отредактировано с некоторыми примерами из реальной жизни. Надеюсь, это поможет.

Ответ №2:

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

 public class HtmlAttributeNoEncoding : System.Web.Util.HttpEncoder
{
    protected override void HtmlAttributeEncode(string value, System.IO.TextWriter output)
    {
        output.Write(value);
    }
}