2009-08-13 2 views
1

, так что через несколько недель у меня есть голова вокруг asp.net mvc и преобразованы два веб-сайта. В дополнение к простому порту, некоторые рефакторинги имели чистое отношение к модели, контроллеру и коду зрения.Я использую asp.net mvc правильно?

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

  1. Проблема: HTML визуализации знаний в контроллере - его очень легко, чтобы ваш бизнес-логики генерировать кучу HTML и засунуть его в ViewData, а затем ваш вид будет куча кода, который выглядит следующим образом:

    < `% = Html.Encode (ViewData [ "Название"])%>

    <`% = Html.Encode (ViewData [ "Содержимое"])%>

    < `% = Html .Encode (ViewData ["Footer"])%>

Какое оптимальное решение для этого? Я, очевидно, хочу избежать этой логики на мой взгляд? Должен ли я записывать данные до клиента и иметь эту «визуализацию» в классах HTMLHelper?

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

Stringbuilder gridBuilder = new StringBuilder(); 

     while (index < objDS.Count) 
     { 
      // start of table row 
      gridBuilder.AppendLine("<tr align=\"center\">"); 
      for (int column = 0; column < numberOfColumns; column++) 
      { 
       if (index < objDS.Count) 
       { 
        int record = (index) + ((objDS.CurrentPageIndex) * 12); 
        DataRow dr = photosDataSet.Tables[0].Rows[record]; 
        gridBuilder.AppendLine("<td width=\"187.5\" valign=\"top\">"); 
        int pictureNumber = Convert.ToInt32(dr.ItemArray[0].ToString()); 
        string picnum = pictureNumber.ToString().PadLeft(3, '0'); 
        int picNumberlink = pictureNumber - 1; 
        string image = "/pics/" + AlbumName + "/Thumbnails/" + AlbumName + "-pic" + picnum + ".jpg"; 
        gridBuilder.AppendLine("<a id=\"picLinks_" + record + "\" class=\"picLinks\" href=''><img class=\"instant ishadow50\" src=\"" + image + "\"></img></a>"); 
        gridBuilder.AppendLine("<br/>"); 
        gridBuilder.AppendLine(dr.ItemArray[1].ToString()); 
        gridBuilder.AppendLine("</td>"); 
       } 
       index++; 
      } 
      gridBuilder.AppendLine("</tr>"); 
     } 
     gridBuilder.AppendLine("</table>"); 

     ViewData["Content"] = gridBuilder.ToString(); 

ответ

2

Answere is - у вас не будет html в вашем контроллере. Если вы не можете использовать сетку из MvcContrib, как было предложено, вы можете создать класс, который принимает DataTable, и выводит html - в переопределенном методе ToString или конкретном методе, который вы вызываете.

И использовать это нравится:

<%= new MyGridGenerator(DataTable ..) %> 
1

На мой взгляд, HTML-кодирование должно выполняться в представлении, поскольку оно специфично для HTML. Если вы переместите эту кодировку до контроллера, вы устраните главное преимущество использования представлений: разделение логики форматирования от бизнес-логики.

+0

мой вопрос заключается в том, что у меня есть код в контроллер, который знает HTML. я обновлю вопрос – leora

1

Для визуализации таблиц HTML я бы порекомендовал вам компонент Grid от MvcContrib.