如果我为包含标题、图像和内容的框创建 PartialView,那么在不使用数据库的情况下存储内容的最佳方法是什么?
示例:涡轮税
我怀疑侧边栏中的框的内容是否存储在数据库中,但为了制作可重用的代码,在 PartialView 中创建结构并填充内容区域将是有益的。我可以创建一个 PartialView 并将一个模型从父 Controller 传递到 PartialView,但是如果我想在另一个页面上使用同一个框,我将无法复制和粘贴相同的内容。
如果我为包含标题、图像和内容的框创建 PartialView,那么在不使用数据库的情况下存储内容的最佳方法是什么?
示例:涡轮税
我怀疑侧边栏中的框的内容是否存储在数据库中,但为了制作可重用的代码,在 PartialView 中创建结构并填充内容区域将是有益的。我可以创建一个 PartialView 并将一个模型从父 Controller 传递到 PartialView,但是如果我想在另一个页面上使用同一个框,我将无法复制和粘贴相同的内容。
将数据传递给在许多地方使用的局部视图可以通过多种方式完成:
为所有模型创建基本模型类。在基类中定义 PartialModel 属性,该属性将持有部分视图的模型(如果使用有很多部分视图,可能会有很多)。现在您可以在控制器操作中填充 PartialModel 属性,但为了使代码更可重用,您可以创建自己的操作过滤器,它将在操作方法执行后(但在模型传递到视图之前)插入部分视图数据
public class PartialViewModelAttribute : ActionFilterAttribute
{
public override void OnActionExecuted(ActionExecutedContext filterContext)
{
BaseViewModel model;
if (filterContext.Controller.ViewData.Model == null)
{
model = new BaseViewModel();
filterContext.Controller.ViewData.Model = model;
}
else
{
model = filterContext.Controller.ViewData.Model as BaseViewModel;
}
model.PartialModel = new PartialModel(...) // Partial model initialization
base.OnActionExecuted(filterContext);
}
}
然后你可以像这样使用它:
[PartialViewModel]
public ActionResult Index()
{
//...
}
另一种选择:您可以为所有控制器创建 BaseController 类,并在基本控制器初始化时创建 PartialModel。然后 PartialModel 可以存储在 ViewData[] 字典中。因为在视图中使用 ViewData 字典不好,所以在 HtmlHelper 上创建扩展方法,如:
public static PartialModel GetPartialModel(this HtmlHelper helper)
{
return helper.viewContext.ViewData["PartialModel"] as PartialModel
}
所以你可以通过这种方式获得模型:
<% Html.RenderPartial("MyPartial", Html.GetPartialModel()); %>
对于固定内容,您可能需要考虑在文件系统中使用 XML+XSLT 甚至 HTML 片段并简单地呈现它们。HtmlHelper 方法可能比部分视图更有意义 - Html.RenderXml() 或 Html.Include()。这些视图和部分视图之间唯一真正的区别是视图引擎没有被调用,因为没有任何替换。我用我的隐私政策和条款和条件来做这种事情。我当然会考虑保留这些缓存。
如果这些确实是模板并且您只是替换内容,那么我认为部分视图效果很好,我会考虑再次将数据放入数据库中,如果我发现性能受到影响,可能会使用缓存。您可以将其与前者结合使用——比如将您的图像/xml 保存在文件系统中,并将指向它们的指针保存在数据库中,以便您知道在部分中选择哪些。