在ASP.NET MVC 3应用程序中处理类别部分视图的最佳方法

时间:2011-05-03 20:51:33

标签: asp.net-mvc asp.net-mvc-3

我在查找表中列出了博客文章类别(~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(模型现在是DRY)中删除了这一行

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 个答案:

答案 0 :(得分:1)

如果在足够的位置使用类别,则可以将其封装到基本控制器类中,并覆盖OnActionExecuted。

然后我会将类别放入ViewBag的属性中,并将其从那里传递到您的局部视图中,并保留视图的模型。

答案 1 :(得分:1)

我想知道为什么没有人建议使用RenderAction。你可以在你的基本控制器中编写这个Action方法。这将使其在所有派生控制器中可用。通过这种方式,您可以强类型地查看类别视图。此外,您应该将您的Categeories视图放在Views / Shared目录中,以便每个控制器都可以访问此视图。这样做会让你干嘛,你仍然可以拥有强烈打字的观点。 编辑顺便说一句,您不必使用基本控制器来使用渲染。虽然上面的方法是有效的,我更喜欢这样做,但你也可以有一个像

这样的nvaigation控制器
Public NavigationController:Controller()
{
     public ActionResult Categories()
    {
        var Categories = FetchFromDB();
        return View(Categoires);
    }
}

现在,您可以在应用程序的任何位置使用renderAction调用此操作方法

答案 2 :(得分:0)

您可能想尝试为模板创建2个显示,一个显示在链接中,另一个显示在下拉列表中。根据您告诉视图使用特定模板的页面。

答案 3 :(得分:0)

您可以创建一个填充类别的过滤器,并将其添加到ViewData / ViewBag。然后,您可以将此过滤器应用于需要类别的控制器/操作。

要进行显示,您可以使用EditorTemplates或Partials来保持您的UI代码DRY ......

HTH。