asp.net HTML кодирует значения свойств

#asp.net #asp.net-mvc

#asp.net #asp.net-mvc

Вопрос:

Я создал класс модели, скажем, Products. Я хочу, чтобы свойство ‘ItemName’ возвращало HTML-ссылку каждый раз, когда оно помещается в HTML-документ. Например:

 public class Product
{
    int ItemID {get; private set;}
    [HtmlReturn(Link=Html.ActionLink("Products", "Details", new {id=ItemID})] // <-- Something like this
    int ItemName {get; private set;}
    int Price {get; private set;}
}
  

Теперь всякий раз, когда в HTML-документе используется ItemName, значение выводится в виде ссылки на страницу продукта / сведений об этом элементе. Это позволило бы выводить имя_элемента во многих разных местах с гарантией того, что он всегда будет ссылкой в любом месте, где на него ссылаются на веб-сайте.

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

1. Вы могли бы вернуть ItemName как пользовательский тип и использовать шаблон для отображения его в виде гиперссылки? Это помогло бы сохранить ваш вид (HTML) отдельно от ваших моделей и view models.

2. Идея заключалась в том, чтобы избежать кодирования в каждом шаблоне, где это может быть использовано. Я надеялся, что существует атрибут, который возвращал бы значение любому представлению при обращении к нему как к строго типизированной модели.

Ответ №1:

Вы могли бы реализовать отдельную переменную-член с помощью средства доступа, доступного только для получения, в вашем Product классе под названием ItemAsLink , который возвращает значение ссылки в формате HTML. Это то, что я обычно делаю, когда сталкиваюсь с подобной ситуацией. Недостатком этого является перемещение части кода пользовательского интерфейса / просмотра / отображения в модель, но, как вы говорите, это помогает при повторном использовании кода.

Предлагаемый вами способ делает то же самое (перемещает код, который должен быть в представлении, в модель). На мой взгляд, это также сбивало бы с толку, потому что ItemName имело бы разное значение в зависимости от того, как оно было вызвано. Это нарушает ожидание, что ItemName всегда одно и то же, независимо от того, как оно используется.

Ответ №2:

Я бы предложил добавить его в качестве метода расширения в ваш класс, чтобы ваш код представления был отделен от вашей модели, вот так:

 public static class ProductHelper
{
   public static MvcHtmlString ProductLink(this HtmlHelper html, Product product)
   {
       return html.ActionLink(product.ItemName, "Details", "Product", new { id = product.Id });
   }
}
  

Затем используйте в своем представлении вот так:

 @Html.ProductLink(product)
  

Который будет генерировать что-то вроде:

 <a href="/products/details/1">Product 1's item name</a>
  

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

1. Спасибо, хотя идея заключалась в том, чтобы иметь некоторый атрибут, чтобы при построении представления не было необходимости указывать ссылку при ссылке на значение. Это помогло бы сделать ссылки на элементы согласованными по всему веб-сайту.