Asp.net MVC中Html.Partial, RenderPartial, Action,RenderAction 区别和用法

转载并勘正自:https://blog.51cto.com/u_176133/3336084

Html.partial和RenderPartial的用法与区别

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

Partial 是将视图内容直接生成一个字符串并返回(相当于有个转义的过程),

RenderPartial方法 是直接输出至当前 HttpContext(因为是直接输出,所以性能好)。

因此它们在视图中的使用方式是不同的:

MVC2:

<%Html.RenderPartial("PartialView");%>输出到 HttpContext
<%=Html.Partial("PartialView")%> 输出为string 直接到页面

MVC3:

@Html.Partial("BasicChart")
@{
        Html.RenderPartial("BasicChart");
}

Html.partial和RenderPartial的其它三个重载很有用:

第二个重载: @{Html.RenderPartial("BasicChart", model);}
用这个重载可以在部分视图里使用强类型,然后在主视图中使用第二个参数传model过去,而不用controller,比如从list中传其中一项myClass过去
第三个重载: 如:@{Html.RenderPartial("BasicChart", model, new ViewDataDictionary { { "key", "value" } };}   
在第二个重载的基础上,增加一个参数传递ViewData

 

Partial 和RenderPartial:

这两个的性质都是一样, 只指把一个个View给镶入进来, 只是回传值有点不一样

Partial 回传的一个Object (MvcHtmlString), 回传一个String 把一堆Html给回传出来, 然后写进到主页面上

@Html.Partial("ViewName")

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

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

这两个方法没有用到Controller Action, 是直接把一个View(Page) 给加进来,而RenderAction 有点不一样, 这是一个Action, 所以会用到Controller Action之后再回传一个页面

public class ChildActionOnlyTestController : Controller

{

  [ChildActionOnly]

  public ActionResult GetSupplierList()

  {

    var controller = new SupplierController();

    return controller.SupplierList();

  }

}

RenderPartial和RenderAction两者的相同点

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

两者的不同点

  1. RenderPatial的数据来自于调用的View,而RenderAction来自自己。
  2. RenderAction会发起一个新的Request,而RenderPatial不会。【个人在实践中在Chrome的Network Tab发现从浏览器端发起的只有主体View页面的那个Request,Response一个组合后的页面, 由此可见该RenderAction发起的新的Request是在服务端一并请求后后主体View页面一并返回的】

@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中使用return PartialView()指定分部视图,在_ViewStatrt.cshtml中指定的Layout会无效。

 
4种PartialView对比:

PartialView

<div>Just a PartialView Test!@ViewBag.Test</div>
@ViewBag.Test

View:

<p>
    @{Html.RenderPartial("ViewUserControl1");}
    @Html.Partial("ViewUserControl1")
    @{Html.RenderAction("ViewUserControl1");}
    @Html.Action("ViewUserControl1")
</p>

Controller:

//Controller:
[ChildActionOnly] //防止直接调用
public ActionResult ViewUserControl1()
{
    ViewBag.Test = "(Action)调用";
    return PartialView();
}

效果:

------------------------------------------------------------------------------------------------------------------

以下内容为更早期转载自:

https://www.cnblogs.com/yaomeng/p/4833346.html

《MVC中@Html.Partial,@Html.Action,@Html.RenderPartial,@Html.RenderAction区别》

Html.RenderPartial与Html.RenderAction这两个方法都是用来在界面上嵌入用户控件的。

 1. Html.RenderPartial是直接将用户控件嵌入到界面上:

<%Html.RenderPartial("LogOnUserControl");%>

 <%Html.RenderPartial("~/Areas/Comm/Views/Shared/LogOnUserControl.ascx");%>

注意:用第一种方法时,用户控件必须放在调用者同一目录下,也可以放在View/Shared中。

2. Html.RenderAction则通过Controller中的Action来调用用户控件

Controller:用户控件所在Controller

public ActionResult UserControl()    
{        
     return  PartialView();     
}

View:调用用户控件的View

< %Html.RenderAction("UserControl","Controller");%>

RenderPartial和RenderAction都是在Asp.net  Mvc中用来显示PartialView的方法,所以在什么时候用哪个方法就是碰到的第一个问题。而要做出正确的选择就需要对这两个都有充分的了解,并且  知道其异同点。这也是本文的主题。

什么是Html.RenderPartial?

Html.RenderPartial在Asp.net  Mvc中是用来调用PartialView的。PartialView基本上就是Asp.net  Webform中的UserControl。调用也很简单,只要在View中把PartialView的名字作为参数传递就可以。比如:

<% Html.RenderPartial("YourPartialView", YourData); %>

YourData是一个可选的参数。如果有,那么YourData会被赋给PartialView中的Model。如果没有,那么调用  RenderPartial的View中的Mode和ViewData会被传递给PartialView。也就是说,PartialView的数据来自于  调用的View。

什么是Html.RenderAction?

Html.RenderAction允许你直接调用某一个Action,并把返回的结果直接显示在当前调用的View中。比如:

<% Html.RenderAction("Show", "Tag"); %>

此时,TagController中的Show方法会被调用。由于这时调用的是一个Action方法,因此可以在此方法中完成你想要完成的各种操作,比如从数据库,文件等获取数据,写数据等并返回结果。

复制代码

[OutputCache(Duration=6000)]
public ActionResult Show()
{
    var tagData = null;
    //Get data from database
    //tagData = tagService.AllHot();
    return PartialView("TagCloud", tagData);
}

复制代码

TagCloud是一个简单的PartialView文件而已。

两者的相同点

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

2.RenderAction会发起一个新的Request,而RenderPatial不会。【个人在实践中在Chrome的Network Tab发现从浏览器端发起的只有主体View页面的那个Request,Response一个组合后的页面, 由此可见该RenderAction发起的新的Request是在服务端一并请求后后主体View页面一并返回的】

如何选择

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

对这四个的区别做一个总结,清理一下思路,方便以后使用:

1、带有Render的方法    @Html.Partial 对应 @{Html.RenderPartial(....);}     @Html.Action 对应  @{Html.RenderAction(....);}

2、Action、RenderAction加载方法的视图,执行

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");

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
ASP.NET MVC使用Vue.js作为前端框架时,可以通过以下步骤配置路由: 1. 安装Vue.js和Vue Router ``` bash npm install vue vue-router --save ``` 2. 在Vue组件定义路由 在Vue组件定义路由,可以通过Vue Router来实现。例如: ```javascript import Vue from 'vue' import VueRouter from 'vue-router' import Home from './components/Home.vue' import About from './components/About.vue' Vue.use(VueRouter) const router = new VueRouter({ routes: [ { path: '/', component: Home }, { path: '/about', component: About } ] }) export default router ``` 以上代码,我们定义了两个路由,分别是'/'和'/about',对应的组件是Home和About。 3. 在MVC视图引入Vue组件 将Vue组件引入到MVC视图,可以通过以下方式实现: ```html <div id="app"> @Html.Partial("_VueComponent") </div> @section Scripts { <script src="@Url.Content("~/Scripts/vue/app.js")"></script> } ``` 其,_VueComponent是Vue组件的文件名,app.js是Vue实例化的入口文件。 4. 实例化Vue对象 在app.js,我们需要实例化Vue对象,并将路由配置传递给Vue对象。例如: ```javascript import Vue from 'vue' import App from './App.vue' import router from './router' new Vue({ el: '#app', router, render: h => h(App) }) ``` 以上代码,我们将路由配置传递给了Vue对象,并在render函数渲染了App.vue组件。 5. 在MVC控制器配置路由 最后,在MVC控制器配置路由,可以通过以下方式实现: ```csharp public class HomeController : Controller { public ActionResult Index() { return View(); } public ActionResult About() { return View(); } } ``` 以上代码,我们定义了两个Action,分别是Index和About,对应的视图是Index.cshtml和About.cshtml。在浏览器访问对应的URL时,会自动跳转到对应的视图面。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值