Лучший способ обработать частичное представление категорий в приложении ASP.NET MVC 3 - PullRequest
2 голосов
/ 04 мая 2011

У меня есть список категорий сообщений в блоге (~ 20) в справочной таблице.Я хочу отобразить их на нескольких страницах в виде списка гиперссылок, по которым пользователь может щелкнуть.Я также хочу отобразить их в раскрывающемся списке в 2 или более местах (страницы с различными видами)

Следующие работы и я вижу категории в виде меню / списка гиперссылок.Но это заставит меня изменить несколько контроллеров, где мне нужно показать категории.Как лучше всего справиться с этим, чтобы у меня было минимальное изменение кода?

//#1 I added new class in one of my model:
namespace MyApp.Models
{
   ...
   public class ShowPostModel
   {
      public Post Post { get; set; }
      public IEnumerable<Category> Categories { get; set; }
   }
   public class Category
   {
      public string _id { get; set; }
      public string Name { get; set; }      
   }
}

//#2 Populating the controller
namespace MyApp.Controllers
{
  public class BlogController : Controller
  {
    public ActionResult ShowPost()
    {
        ShowPostModel viewModel = new ShowPostModel();
        viewModel.Post = ReadBlogPostFromDB();
        viewModel.Categories = ReadCategoriesFromDB();
        return View(viewModel);
    }
  }
}

//#3 This is from my main view for showing the Post:
@Html.Partial("_Categories", Model.Categories)

//#4 This is my _Categories partial view:
@model IEnumerable<MyApp.Models.Category>
<section>
   <header><b>Categories</b></header>
   <ul style="padding:0;margin:0;">
      @foreach (var cat in Model)
      {
        <li>
           <a href="/post/browse/cid=@cat._id">@cat.Name</a>
        </li>
      }
   </ul>
 </section>

Спасибо за чтение

Редактировать: я внес эти изменения, и, похоже, тоже работает.Любые комментарии или улучшения, которые я могу сделать здесь?

// # 1 удалил эту строку из открытого класса ShowPostModel (модель теперь СУХАЯ)

public IEnumerable<Category> Categories { get; set; } // удалено

// # 2 создал базовый контроллер и унаследовал от него

public abstract class BlogBaseController : Controller
   {
      public BlogBaseController()
      {
         ViewBag.Categories = ReadCategoriesFromDB();                  
      }
   }

// # 3 принудительно установил все контроллеры, где мне нужны категории для наследования от базового контроллера

public class BlogController : BlogBaseController

// # 4 изменить то, как я читаю в моих взглядах

@Html.Partial("_Categories", (IEnumerable<MyApp.Models.Category>)@ViewBag.Categories)

Ответы [ 4 ]

1 голос
/ 04 мая 2011

Интересно, почему никто не предложил использовать RenderAction. Вы можете написать этот метод Action в своем базовом контроллере. это сделает его доступным во всех производных контроллерах. таким образом, вы можете иметь строго типизированный вид категорий. Более того, вы должны поместить свое представление Categeories в каталог Views / Shared, чтобы каждый контроллер имел доступ к этому представлению. Это сделает вас СУХИМ, и вы по-прежнему будете иметь преимущества от строго типизированного представления. РЕДАКТИРОВАТЬ Кстати, вам не нужно иметь базовый контроллер для использования рендеринга. Хотя вышеуказанный подход действителен, и я предпочитаю делать так, но у вас также может быть контроллер nvaigation, такой как

Public NavigationController:Controller()
{
     public ActionResult Categories()
    {
        var Categories = FetchFromDB();
        return View(Categoires);
    }
}

Теперь вы можете вызывать этот метод действия с помощью renderAction в любом месте вашего приложения.

1 голос
/ 04 мая 2011

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

Затем я бы поместил Categories в свойство в ViewBag и передал бы его в ваш частичныйоттуда и оставь модель своего вида в покое.

0 голосов
/ 04 мая 2011

Вы можете создать фильтр, который заполняет ваши категории и добавляет его в ViewData / ViewBag. Затем вы можете применить этот фильтр к контроллерам / действиям, которым требуются категории.

Для отображения вы можете использовать EditorTemplates или Partials, чтобы сохранить ваш код пользовательского интерфейса СУХИМЫМ ...

НТН.

0 голосов
/ 04 мая 2011

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

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