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

示例: TurboTax

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

有帮助吗?

解决方案

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

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

其他提示

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

为您的所有模型创建基础模型类。在基类中定义PartialModel属性,该属性将保存部分视图的模型(如果使用有许多部分视图,则可能有许多属性)。现在您可以在控制器操作中填充PartialModel属性,但为了使代码更具可重用性,您可以创建自己的Action Filter,它将在执行action方法之后插入部分视图数据(但在模型传递给视图之前)

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()); %>
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top