Что лучше для отображения множества небольших значений в ASP.Net MVC - HTML-помощник или частичное представление - PullRequest
1 голос
/ 30 июня 2010

У нас есть небольшой проект Asp.Net MVC, который отображает отчет из нескольких десятков или сотен строк данных.Каждая строка представлена ​​объектом в моделях представления.

В настоящее время мы показываем строки, подобные этой:

<table>
   <tr style="text-align:center">
        <th>Name</th>
        <th>Item count</th>
        <th>Stat 1</th>
        <th>Stat 2</th>
        <th>Etc</th>
   </tr>
<%  var alternating = false;
    foreach(RowItem rowItem in Model.RowItems) 
    { %>
   <%= Html.BeginRow(alternating) %>
   <%= Html.ShowRow(rowItem) %>
   <% alternating = !alternating; %>
   <%= Html.EndRow() %>
   <% } %>
</table>

Где BeginRow, EndRow и ShowRow являются вспомогательнымиметоды расширения, которые я написал.ShowRow это что-то вроде

public static string ShowRow(this HtmlHelper html, RowItem rowItem)
{
   return "<tr><td>.... </tr>";
}

Но я также мог бы заменить Html.ShowRow(rowItem) другим частичным представлением, то есть Html.RenderPartial("RowControl", rowItem);

Вопрос в том, каковы преимущества и недостатки этихдва подхода?Все, что я могу придумать, это то, что частичное представление является более «проектируемым» - с ним легче работать, когда amrkup сложен, и членами команды, которые специализируются на «дизайне» и «разработке клиента», т.е.,Вспомогательный HTML-метод - это просто сборка строки, содержащей требуемый HTML, который обращается к программисту старой школы.

Какой из них, если таковой имеется, имеет заметные последствия для производительности для сотен элементов?Есть ли какие-либо последствия для технического обслуживания?При прочих равных условиях, что бы вы выбрали для использования?

Мы находимся на Asp.Net MVC 1.0 и Visual Studio 2008, но, вероятно, через несколько месяцев обновимся.

Ответы [ 2 ]

1 голос
/ 01 июля 2010

Я не уверен, насколько хорошо это известно (я только что узнал, поигрывая с собой), но вы можете использовать анонимные методы для определения фрагментов содержимого вашей страницы, так что это альтернатива определению отдельного частичного представления. , Я нахожу это особенно полезным, когда у меня есть небольшой фрагмент кода HTML / сервера, который я хочу использовать повторно, или если я не хочу определять сложный контракт Model / ViewData между частичным представлением и вызывающим представлением.

Ниже приведен пример кода, встроенного в представление:

// define example data
IEnumerable<MyDataItem> data = new MyDataItem[] {
    new MyDataItem { Id = 1, Value = "ABC" },
    new MyDataItem { Id = 1, Value = "BCD" },
    new MyDataItem { Id = 1, Value = "CDE" },
    new MyDataItem { Id = 1, Value = "DEF" },
};

// an anonymous method to define reused HTML/server code
Action<MyDataItem> displayData = delegate(MyDataItem item)
{
    %><span class="my-data-class" title="This is my data!"><%= item.Value %></span><%   
};
%><div><%

// use the displayData delegate to render a table       
%><table><%
foreach (MyDataItem item in data)
{
    %><tr><td><% displayData(item); %></td></tr><%
}   
%></table><%

// use the displayData delegate to render a set of divs
foreach (MyDataItem item in data)
{
    %><div><% displayData(item);%></div><%
}   
%></div><%

Приведенный выше пример отображает следующий HTML-код (отформатированный для ясности):

<div>
  <table>
    <tr>
      <td>
        <span class="my-data-class" title="This is my data!">
        ABC</span>
      </td>
    </tr>
    <tr>
      <td>
        <span class="my-data-class" title="This is my data!">
        BCD</span>
      </td>
    </tr>
    <tr>
      <td>
        <span class="my-data-class" title="This is my data!">
        CDE</span>
      </td>
    </tr>
    <tr>
      <td>
        <span class="my-data-class" title="This is my data!">
        DEF</span>
      </td>
    </tr>
  </table>
  <div>
    <span class="my-data-class" title="This is my data!">ABC</span>
  </div>
  <div>
    <span class="my-data-class" title="This is my data!">BCD</span>
  </div>
  <div>
    <span class="my-data-class" title="This is my data!">CDE</span>
  </div>
  <div>
    <span class="my-data-class" title="This is my data!">DEF</span>
  </div>
</div>
0 голосов
/ 30 июня 2010

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

Мне не очень нравится то, что здесь происходит, по нескольким причинам. Расширение show row, вероятно, принимает в качестве входных данных какой-то пользовательский объект HtmlTableRow, который, вероятно, содержит коллекцию объектов HtmlTableCell, для каждого из которых установлены стилистические свойства. Поскольку эти HtmlTableRow s созданы в вашем контроллере, он тесно связывает вашу презентацию с вашим контроллером, что противоречит принципу разделения интересов MVC.

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...