#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. Спасибо, хотя идея заключалась в том, чтобы иметь некоторый атрибут, чтобы при построении представления не было необходимости указывать ссылку при ссылке на значение. Это помогло бы сделать ссылки на элементы согласованными по всему веб-сайту.