Рендеринг C# возражает против HTML

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

Вот функция для добавления:

function columnWrap(val){
    return '<div style="white-space:normal !important;">'+ val +'</div>';
}

Затем добавьте renderer: columnWrap к каждому столбцу, который вы хотите обернуть

new Ext.grid.GridPanel({
[...],
columns:[{   
     id: 'someID',
     header: "someHeader",
     dataIndex: 'someID',
     hidden: false,
     sortable: true,
     renderer: columnWrap           
}]
7
задан Jon Skeet 25 May 2009 в 22:07
поделиться

6 ответов

I can't agree more with John Feminella. Integrating Html rendering directly into your domain entities is a horrid pollution of your domain with a completely arbitrary and external concern. Like John said, you will make your entities very brittle by doing that, and break both of those critical rules: Separation of Concerns and Single Responsibility.

From the choices you gave, #3 is the closest to an appropriate way to do it. You need not write your own template engine. There are plenty free and ready-made template engines on the net that will do the job more than adequately (NVelocity, StringTemplate, Brail, etc. etc.)

Keep rendering where it belongs...in your presentation/view, and don't pollute your domain with higher level concerns.

3
ответ дан 6 December 2019 в 15:29
поделиться

Однажды мне потребовалось преобразовать коллекцию любого типа в таблицу Html. Я создал метод расширения для IEnumerable , в котором были перегрузки для css и т.п. Вы можете увидеть мое сообщение в блоге об этом здесь:

http://crazorsharp.blogspot.com/2009/03/cool-ienumberable-extension-method_25.html

Он использует отражение для получения всех свойств объекта. , и визуализирует красивый маленький столик. Посмотрим, сработает ли это для вас.

[System.Runtime.CompilerServices.Extension()]
public string ToHtmlTable<T>(IEnumerable<T> list, string propertiesToIncludeAsColumns = "")
{
    return ToHtmlTable(list, string.Empty, string.Empty, string.Empty, string.Empty, propertiesToIncludeAsColumns);
}

[System.Runtime.CompilerServices.Extension()]
public string ToHtmlTable<T>(IEnumerable<T> list, string tableSyle, string headerStyle, string rowStyle, string alternateRowStyle, string propertiesToIncludeAsColumns = "")
{
    dynamic result = new StringBuilder();
    if (String.IsNullOrEmpty(tableSyle)) {
        result.Append("<table id=\"" + typeof(T).Name + "Table\">");
    } else {
        result.Append((Convert.ToString("<table id=\"" + typeof(T).Name + "Table\" class=\"") + tableSyle) + "\">");
    }

    dynamic propertyArray = typeof(T).GetProperties();

    foreach (object prop in propertyArray) {
       if (string.IsNullOrEmpty(propertiesToIncludeAsColumns) || propertiesToIncludeAsColumns.Contains(prop.Name + ",")) {
        if (String.IsNullOrEmpty(headerStyle)) {
            result.AppendFormat("<th>{0}</th>", prop.Name);
        } else {
            result.AppendFormat("<th class=\"{0}\">{1}</th>", headerStyle, prop.Name);
        }
      }
    }

    for (int i = 0; i <= list.Count() - 1; i++) {
        if (!String.IsNullOrEmpty(rowStyle) && !String.IsNullOrEmpty(alternateRowStyle)) {
            result.AppendFormat("<tr class=\"{0}\">", i % 2 == 0 ? rowStyle : alternateRowStyle);

        } else {
            result.AppendFormat("<tr>");
        }
        foreach (object prop in propertyArray) {
            if (string.IsNullOrEmpty(propertiesToIncludeAsColumns) || propertiesToIncludeAsColumns.Contains(prop.Name + ",")) {
                object value = prop.GetValue(list.ElementAt(i), null);
                result.AppendFormat("<td>{0}</td>", value ?? String.Empty);
            }
        }
        result.AppendLine("</tr>");
    }

    result.Append("</table>");

    return result.ToString();
}
5
ответ дан 6 December 2019 в 15:29
поделиться

Я искренне предпочитаю метод A. HTML уже является стандартом, поэтому не стоит слишком сильно ругать себя промежуточными форматами, такими как XML (через XSL - метод 2) или пользовательский формат ( метод 3).

Однако при написании в / для ASP.NET MVC вы можете создать .ASCX (пользовательский элемент управления), который будет принимать объект вашего типа и отображать соответствующий HTML. И вы не получите неприятных отступов C #, выделения и автозаполнения.

Вы также можете написать несколько пользовательских представлений, чтобы приспособить разные сценарии для одного типа объекта.

2
ответ дан 6 December 2019 в 15:29
поделиться

Это работа вашего представления, а не контроллеров или моделей. Как вы подозреваете, использование метода (1) сделает ваши изменения очень хрупкими. Вместо этого напишите фрагмент представления для каждого способа, которым вы хотите отобразить конкретный объект домена. Затем просто откройте соответствующие представления, чтобы создать последнюю страницу.

3
ответ дан 6 December 2019 в 15:29
поделиться

Лично я бы совмещал второй и третий метод: просто создайте общий XML-документ с помощью отражения, скажем:

<object type="xxxx">
    <property name="ttt" value="vvv"/>
    ...
</object>

и используйте таблицу стилей XSTL для создания фактического HTML из этого.

0
ответ дан 6 December 2019 в 15:29
поделиться

Есть ли причина, по которой вы не хотите создавать файл .ascx настраиваемого элемента управления, который принимает объект сущностей домена в качестве аргумента, а затем вы можете сделать графический интерфейс любым удобным для вас способом. Таким образом, вы могли динамически добавлять элементы управления на страницу и просто устанавливать свойство для их заполнения.

Редактировать 1: Просто визуализируйте элемент управления в HTMLTextWriter вместо того, чтобы размещать его на странице.

        StringBuilder outString = new StringBuilder();
        StringWriter outWriter = new StringWriter(outString);
        HtmlTextWriter htmlText = new HtmlTextWriter(outWriter);
        System.Web.UI.WebControls.Label lbl1 = new System.Web.UI.WebControls.Label();
        lbl1.Text = "This is just a test!";
        lbl1.ToolTip = "Really";
        lbl1.RenderControl(htmlText);
        ViewData["Output"] = outString.ToString();

Вывод

<span title="Really">This is just a test!</span>

Конечно, используйте свой собственный элемент управления вместо встроенного элемента управления, но это была быстрая и простая демонстрация.

0
ответ дан 6 December 2019 в 15:29
поделиться
Другие вопросы по тегам:

Похожие вопросы: