我在查找表中列出了博客文章类别(~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)
答案 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。