如果我为包含标题,图像和内容的框创建PartialView,那么在不使用数据库的情况下存储内容的最佳方式是什么?
示例:TurboTax
我怀疑侧边栏中的框的内容是存储在数据库中,但是为了制作可重复使用的代码,在PartialView中创建结构并填充内容区域将是有益的。我可以创建一个PartialView并将一个模型从父控制器传递给PartialView,但如果我想在另一个页面上使用相同的框,我将被困在复制和粘贴相同的内容。
答案 0 :(得分:1)
将数据传递到许多地方使用的局部视图可以通过多种方式完成:
为您的所有模型创建基础模型类。在基类中定义PartialModel属性,该属性将保存部分视图的模型(如果使用有许多部分视图,则可能有许多属性)。现在您可以在控制器操作中填充PartialModel属性,但是为了使代码更具可重用性,您可以创建自己的Action Filter,它将在执行action方法之后插入部分视图数据(但在模型传递给视图之前)< / 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()); %>
答案 1 :(得分:1)
对于固定内容,您可能需要考虑在文件系统中使用XML + XSLT甚至HTML片段并简单地渲染它们。 HtmlHelper方法可能比部分视图更有意义 - Html.RenderXml()或Html.Include()。这些视图引擎和部分视图之间唯一真正的区别在于,由于没有任何替换,因此不会调用视图引擎。我的隐私政策和条款和条件都是这样做的。我当然会考虑保留这些缓存。
如果这些都是模板而你只是替换内容,那么我认为部分视图效果很好,我会考虑将数据放入数据库中,如果我发现性能受到影响,可能会再次使用缓存。您可以将它与前者结合使用 - 例如,将您的images / xml保存在文件系统中,并在数据库中指向它们,以便您知道要在部分中选择哪些。