【问题标题】:Reusable Content Box Data In ASP.NET MVC?ASP.NET MVC 中的可重用内容框数据?
【发布时间】:2010-12-20 13:56:49
【问题描述】:

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

示例:TurboTax

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

【问题讨论】:

  • 您能否提供一些关于为什么要避免使用数据库的信息?这很可能是最好的解决方案。

标签: asp.net-mvc partial-views code-reuse


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

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

    为所有模型创建基础模型类。在基类中定义 PartialModel 属性,该属性将持有部分视图的模型(如果使用有很多部分视图,可能会有很多)。现在您可以在控制器操作中填充 PartialModel 属性,但是为了使代码更具可重用性,您可以创建自己的操作过滤器,它将在操作方法执行后(但在模型传递到视图之前)插入部分视图数据/p>

    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()); %>
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-10-25
      • 2011-05-07
      • 1970-01-01
      • 1970-01-01
      • 2010-12-08
      相关资源
      最近更新 更多