zoukankan      html  css  js  c++  java
  • Html.PartialView(),html.Renderpartial,html.action.html.RenderAction 辅助方法

    Html.Partial(), 返回HTML字符串 。参数为部分视图

    html.RenderPartial(),不返回返回HTML字符串 ,直接输出响应流。参数为部分视图

    一般用于主视图中已经存在了这个视图所需要的模型或通过当前控制器操作方法ViewBag动态对象已经带回到了视图中。一般形式为 @Html.Partial("_particalView",Model).或@{html.RenderPartial("_particalView",Model);}

    html.RenderPartial()性能一般优于Html.Partial()。

    Html.Action(),返回返回HTML字符串 ,需要调用 控制器上的操作方法(一般为[ChildAction]),通过操作方法返回一个部分视图。 参数为操作方法。

    Html.RenderAction()  不返回返回HTML字符串 ,直接输出响应流。参数为控制器操作方法。

    Html.RenderAction() 性能一般优于 html.Action()

    一般用于主视图中不存在模型,需要调用操作方法去取得模型。一般形式为 @Html.Action("_someAction",routedata),@{Html.RenderAction("_someAction",routedata),routedata);} 用于给控制器操作方法传递参数。再由子操作方法返回一个分部视图, return PartialView("_LeftSideMenu", viewModels);

    Html.Action()和Html.RenderAction() 的灵活性比 Html.Partial()和html.RenderPartial()要高,可以在调用的Action 中对处理进行处理。

    并且 Html.RenderAction() 和html.Action 在asp.net MVC 可以跨控制器使用,利于同一项目中代码的重用。 html.RenderPartial()和 Html.Partial() 只有在模型类型相同的情况下才能利用,

    实例:

    在Home 控制器的List方法的视图 List.cshtml中:

    div class="row">
    <div class="col-md-3">
    @*体现了分部视图的优势相当于用户控件共享的优势。既可供Home控制器使用,同时也供Article控制器使用,但主控制器必须提供相应的参数或ViewBag动态参数。由于采用的是Html.RenderAction方法,所有共享的是实际上是操作方法,但实际效果是共享视图。*@
    @{Html.RenderAction("LeftSideMenu", "home", new { area = "", ActiveCategoryID = ViewBag.CategoryID });} <!--//返回一个导航菜单面板 ,通过链接的 RouteValue 传递一个参数数。-->
    @{Html.RenderAction("ClickRangeOnCategory", "home", new { area = "", ActiveCategoryID = ViewBag.CategoryID });} <!--//返回一个本栏目的点击排行-->


    </div>

    Home控制器中的操作方法:

    [ChildActionOnly]

    public ActionResult LeftSideMenu(string ActiveCategoryID)
    {
    var categorys = _categoryService.FindAll().Where(c => c.NavbarIsShow).OrderBy(c => c.PriorOrder).ToList();
    List<CategoryLeftSideViewModel> viewModels =new List<CategoryLeftSideViewModel>();
    foreach( var item in categorys)
    {
    int _categoryCount = _articleService.FindAll().Where(a => a.CategoryID == item.CategoryID).Count();
    viewModels.Add(new CategoryLeftSideViewModel { CategoryID=item.CategoryID,CategoryName=item.CategoryName, Active=(item.CategoryID ==ActiveCategoryID), ArticleCount=_categoryCount});


    }

    return PartialView("_LeftSideMenu", viewModels);

    }

    [ChildActionOnly]
    public ActionResult ClickRangeOnCategory(string ActiveCategoryID)
    {
    var articles = _articleService.FindAll().Where(a => a.Category.CategoryID == ActiveCategoryID);
    if (articles.Count() >= 5)
    {
    articles = articles.Take(5);
    }

    return PartialView("_ClickRangeOnCategory", articles.OrderByDescending(a => a.ClickCount).ThenByDescending(a =>a.PostTime).ToList());

    }

    在Article控制器中的listArticle.cshtml 视图中使用, 

    <div class="row">
    <div class="col-md-3">
    @*体现了分部视图的优势相当于用户控件共享的优势。既可供Home控制器使用,同时也供Article控制器使用,但主控制器必须提供相应的参数或ViewBag动态参数。由于采用的是Html.RenderAction方法,所有共享的是实际上是操作方法,但实际效果是共享视图。*@
    @{Html.RenderAction("LeftSideMenu", "home", new { area = "", ActiveCategoryID = ViewBag.CategoryID });} <!--//返回一个导航菜单面板 ,通过链接的 RouteValue 传递一个参数数。-->
    @{Html.RenderAction("ClickRangeOnCategory", "home", new { area = "", ActiveCategoryID = ViewBag.CategoryID });} <!--//返回一个本栏目的点击排行-->


    </div>

    由于 使用了@html.RenderAction(),所以不需要在Article控制器中定义操作方法,只是重新调用一次 home控制器的LeftSideMenu、ClickRangeOnCategory方法。就能在跨控制器的不同的视图中得到相同的部分视图。

    很好的实践了DRY原则。(不要重复你自己)。

  • 相关阅读:
    根据IP地址查找MAC地址
    MongoDB导入导出以及数据库备份
    本地mongodb数据库导出到远程数据库中
    datatable自动增加序号
    IDEA出现无法加载主类
    远程连接本地mongodb 数据库
    js将后台传入得时间格式化
    Java蓝桥杯--基础练习 (6)回文数
    Java蓝桥杯--基础练习(5)杨辉三角形
    Java蓝桥杯--基础练习(4)查找整数
  • 原文地址:https://www.cnblogs.com/liuyuanhao/p/4478011.html
Copyright © 2011-2022 走看看