1

如果我为包含标题、图像和内容的框创建 PartialView,那么在不使用数据库的情况下存储内容的最佳方法是什么?

示例:涡轮税

我怀疑侧边栏中的框的内容是否存储在数据库中,但为了制作可重用的代码,在 PartialView 中创建结构并填充内容区域将是有益的。我可以创建一个 PartialView 并将一个模型从父 Controller 传递到 PartialView,但是如果我想在另一个页面上使用同一个框,我将无法复制和粘贴相同的内容。

4

2 回答 2

1

将数据传递给在许多地方使用的局部视图可以通过多种方式完成:

为所有模型创建基本模型类。在基类中定义 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()); %>
于 2009-11-26T08:33:55.123 回答
1

对于固定内容,您可能需要考虑在文件系统中使用 XML+XSLT 甚至 HTML 片段并简单地呈现它们。HtmlHelper 方法可能比部分视图更有意义 - Html.RenderXml() 或 Html.Include()。这些视图和部分视图之间唯一真正的区别是视图引擎没有被调用,因为没有任何替换。我用我的隐私政策和条款和条件来做这种事情。我当然会考虑保留这些缓存。

如果这些确实是模板并且您只是替换内容,那么我认为部分视图效果很好,我会考虑再次将数据放入数据库中,如果我发现性能受到影响,可能会使用缓存。您可以将其与前者结合使用——比如将您的图像/xml 保存在文件系统中,并将指向它们的指针保存在数据库中,以便您知道在部分中选择哪些。

于 2009-11-26T14:18:52.540 回答