MVC中Html.Partial, RenderPartial, Action,RenderAction 区别

1、  Html.partial和RenderPartial的区别

Html.partial和RenderPartial都是输出html片段,区别在于:

@Html.Partial用于将分部视图渲染为字符串, 是将视图内容直接生成一个字符串并返回(相当于有个转义的过程)。@{Html.RenderPartial}方法是将分布视图直接写入响应输出流(当前 HttpContext)(因为是直接输出,所以性能好,微量影响)。使用所以只能直接放在代码块中,不能放在表达式中(返回值是void)。使用方式是不同:@Html.Partial("BasicChart")//输出为string 直接到页面

@{

Html.RenderPartial("BasicChart");//输出到 HttpContext

}

Html.partial和RenderPartial的其它三个重载很有用,第二个重载@{Html.RenderPartial("BasicChart",model);}

用这个重载可以在部分视图里使用强类型,然后在主视图中使用第二个参数传model过去,而不用controller,比如从list中传其中一项myClass过去

第三个重载用来传ViewData同理,如:@{Html.RenderPartial("BasicChart",ViewData["myData"]);}

具体:

这两个的性质都是一样, 只指把一个个View给镶入进来, 只是回传值有点不一样Partial 回传的一个Object (MvcHtmlString), 回传一个String 把一堆Html给回传出来, 然后写进到主页面上

@Html.Partial("ViewName")

RenderPartial 回传的是void, 而这个方法会在主页面上添加指定的View

@{Html.RenderPartial("ViewName");} 

这两个方法没有用到Controller, 是直接把一个View(Page) 给加进来

注意:分部视图必须放在调用者同一目录下,或者放在View/Shared中

2、与RenderAction比较

RenderAction 有点不一样, 这是一个Action, 所以会用到Controller 之后再回传一个页面

public class ChildActionOnlyTestController : Controller

{

 [ChildActionOnly] //防止直接调用 (在浏览器中直接访问)

  public ActionResult GetSupplierList()

  {

    var controller = new SupplierController();

    return controller.SupplierList();

  }

}

3、RenderPartial和RenderAction两者的相同点

通常都被用来显示一个功能相对独立的“块”,比如说显示菜单或者导航条。 两者输出的结果都被作为调用的View的一部分显示。两者的不同点

 1、RenderPatial的数据来自于调用的View,而RenderAction来自自己。

2、RenderAction会发起一个新的Request,而RenderPatial不会

@Html.Partial/@{Htmt.RenderPartial()}

@Html.Partial用于将分部视图渲染为字符串

@{Html.RenderPartial}将分布视图直接写入响应输出流,所以只能直接放在代码块中,不能放在表达式中(返回值是void)

RenderPartial因为是直接写在响应流中,所以性能会更好(微量影响),而Partial不用写在代码块中,所以更方便

@Html.Action()/@Html.RenderAction()

和Partial与RenderPartial类似,但是因为会通过Action,所以更灵活,可以利用控制器上下文。

在Action中可以通过IsChildAction来判断是被Url直接调用还是被Action()/RenderAction()调用

可以利用重载直接参数给Action。

RenderAction优先使用ActionNameAttribute。

Action中使用returnPartialView()指定分部视图,在_ViewStatrt.cshtml中指定的Layout会无效。

 几种PartialView对比:

PartialView:

<div>Just aPartialView Test!@ViewBag.Test</div>

@ViewBag.Test

 View:

<p>

   @{Html.RenderPartial("ViewUserControl1");}

    @Html.Partial("ViewUserControl1")

    @{Html.RenderAction("ViewUserControl1");}

    @Html.Action("ViewUserControl1")

</p>

Controller:

Controller:

[ChildActionOnly]//防止直接调用(在浏览器中直接访问)

publicActionResult ViewUserControl1()

{

    ViewBag.Test = "(Action)调用";

    return PartialView();

}

效果:

Just a PartialViewTest!

Just a PartialViewTest!

Just a PartialViewTest!(Action)调用

(Action)调用

Just a PartialViewTest!(Action)调用

(Action)调用

综合一下

1、带有Render的方法   

@Html.Partial 对应 @{Html.RenderPartial(....);}

 @Html.Action 对应 @{Html.RenderAction(....);}

2、Action、RenderAction加载方法的视图,执行Controller → Model → View的顺序,然后把产生的页面带回到原来的View中再回传。而Partial、RenderPartial直接加载视图文件内容,执行

3. Html.Partial可以直接提供用户控件名作为参数,而Html.Action需要有对应的Action,在Action内部返回PartailResult(即retun PartialView())。

4、对于简单的没有任何逻辑的用户控件,推荐使用Html.Partial;对于需要设置一些Model的用户控件,推荐使用Html.Action。当然,有Model数据也是可以使用Html.Partial方法的,可以看方法的重载。

5、使用Html.Action有个好处,就是可以根据不同的场景选择不同的用户控件。比如:
@Html.Action("UserInfoControl")
在对应的UserInfoControl这个Action中,在用户未登录的时候,可以retun PartialView("LogOnUserControl");登录后,可以retun PartialView("UserInfoControl");

 

如何选择:

根据不同点(RenderAction会发起一个新的Request,而RenderPatial不会

),由于RenderAction会调用一个新的Action方法,而Asp.net Mvc中Action是最小的缓存单位,因此如果某一个“块”的数据比较固定,不会因为访问者的不同而发生变化,那么这时就是使用 RenderAction的时候了。 题外话,对于RenderAction会发起一个新的Request,感觉对调用页面的流程有点破坏。一个View在显示的时候,自己又发起一个 Request去获取数据来显示,显然有点破坏了作为一个View的原则:

A View should onlyknow how to render, but not what to render!

 参考:

http://blog.csdn.net/wilsonke/article/details/11668181

http://www.cnblogs.com/firstcsharp/p/5232171.html

http://www.cnblogs.com/gesenkof99/archive/2013/06/03/3115052.html


  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值