文章有点长,但大多是代码,看看很快的,不要压力太大。网上有很多关于这两个方法的区别,都说出了它本质的区别(不看代码,只看这个结论,就已经足够了,如果觉得有必要从代码中得出这个结论,那就继续往下看),这里从代码中跟大家说说它们的区别,这两个扩展方法都是用来加载部分视图,先说下它们本质上的区别, RenderPartial是直接返回一个视图,而Partial返回的是视图的字符串,即一个返回视图对象,一个返回字符串。内部做了什么呢?接下来详细介绍。
1.Partial

反编译工具中对这个扩展类的描述如下:Represents the functionality to render a partial view as an HTML-encoded string.大概意思就是生成一个部分页作为一个HTML字符串(英语比较好的,再翻译翻译,哈哈)。

这个方法是HtmlHelper的扩展方法,这个方法有四个重载,用Reflector工具看下,代码如下:

  1. public static class PartialExtensions
  2. {
  3. // Methods
  4. public static MvcHtmlString Partial(this HtmlHelper htmlHelper, string partialViewName);
  5. public static MvcHtmlString Partial(this HtmlHelper htmlHelper, string partialViewName, object model);
  6. public static MvcHtmlString Partial(this HtmlHelper htmlHelper,string partialViewName,ViewDataDictionary viewData);
  7. public static MvcHtmlString Partial(this HtmlHelper htmlHelper, string partialViewName, object model, ViewDataDicti                                                            onary viewData);
  8. }

四个方法都差不多,区别就是传给它们的参数(不同的参数都是咱们传给视图的数据viewData和model),这里就说说第一个和第四个方法,其他都一样。

(1)两个参数的Partial

反编译工具中代码如下:

  1. public static MvcHtmlString Partial(this HtmlHelper htmlHelper, string partialViewName)
  2. {
  3. return htmlHelper.Partial(partialViewName, null, htmlHelper.ViewData);
  4. }

第一个参数是扩展方法的语法,这里就不说了。这个方法又调用了一个Partial方法,这个方法就是HtmlHelper中的原生方法了,进去看看它干了什么:

  1. public static MvcHtmlString Partial(this HtmlHelper htmlHelper, string partialViewName, object model, ViewDataDictionary viewData)
  2. {
  3. using (StringWriter writer = new StringWriter(CultureInfo.CurrentCulture))
  4. {
  5. htmlHelper.RenderPartialInternal(partialViewName, viewData, model, writer, ViewEngines.Engines);
  6. return MvcHtmlString.Create(writer.ToString());
  7. }
  8. }

很明显,它用了一个StringWriter,看到这个肯定就知道跟字符串有关了,再说下里面调用的那两个方法的作用(直接在代码里讲解啦):

  1. internal virtual void RenderPartialInternal(string partialViewName, ViewDataDictionary viewData, object model, TextWriter writer, ViewEngineCollection viewEngineCollection)
  2. {
  3. if (string.IsNullOrEmpty(partialViewName))
  4. {
  5. throw new ArgumentException(MvcResources.Common_NullOrEmpty, "partialViewName");
  6. }
  7. ViewDataDictionary dictionary = null;
  8. if (model == null)
  9. {
  10. if (viewData == null)
  11. {
  12. dictionary = new ViewDataDictionary(this.ViewData);//这些步骤,肯定是在装填咱们的数据了,下同
  13. }
  14. else
  15. {
  16. dictionary = new ViewDataDictionary(viewData);
  17. }
  18. }
  19. else if (viewData == null)
  20. {
  21. dictionary = new ViewDataDictionary(model);
  22. }
  23. else
  24. {
  25. ViewDataDictionary dictionary2 = new ViewDataDictionary(viewData) {//我现在还不明白这个的作用,了解的同志,求教
  26. Model = model
  27. };
  28. dictionary = dictionary2;
  29. }
  30. ViewContext viewContext = new ViewContext(this.ViewContext, this.ViewContext.View, dictionary, this.ViewContext                                                          .TempData, writer);
  31. FindPartialView(viewContext, partialViewName, viewEngineCollection).Render(viewContext, writer);
    //这个方法就是用来生成视图的,具体代码往下看。Render方法就是讲FindPartialView方法返回的视图写入writer流,详情继续看FindPartialView的代码。
    }
  1. 再来看下这个代码,MvcHtmlString.Create(writer.ToString()),看了这个大家就明白了:
  1. //它先调用这个方法
    public static MvcHtmlString Create(string value)
  2. {
  3. return new MvcHtmlString(value);
  4. }
  5. //然后实例化一个MvcHtmlString,大家看到了,其实它就是将刚才写入writer中的内容转为字符串,这里就是说Partial返回的是字符串的原因
  6. public MvcHtmlString(string value) : base(value ?? string.Empty)
  7. {
  8. this._value = value ?? string.Empty;
  9. }

最本质的东西大家都看到了,最后再说下FindPartialView这个方法(直接注释代码喽):

  1. internal static IView FindPartialView(ViewContext viewContext, string partialViewName, ViewEngineCollection viewEngineCollection)
  2. {
  3. ViewEngineResult result = viewEngineCollection.FindPartialView(viewContext, partialViewName);//从视图引擎集合中搜索名partialViewName视图
  4. if (result.View != null)//如果找到该视图,直接将视图返回
  5. {
  6. return result.View;
  7. }
  8. StringBuilder builder = new StringBuilder();//这些代码就不说了,不知所云,知道的朋友,求教
  9. foreach (string str in result.SearchedLocations)
  10. {
  11. builder.AppendLine();
  12. builder.Append(str);
  13. }
  14. throw new InvalidOperationException(string.Format(CultureInfo.CurrentCulture, MvcResources.Common_PartialViewNotFound, new object[] { partialViewName, builder }));
  15. }

执行了FindPartialView之后,会返回一个View,返回View之后执行Render方法,Render方法中应该是将这个返回的视图写入writer中(反编译工具没得看,原理应该是这样的)。

(2)四个参数的Partial

直接看代码,大家就清楚了:

  1. public static MvcHtmlString Partial(this HtmlHelper htmlHelper, string partialViewName, object model, ViewDataDictionary viewData)
  2. {
  3. using (StringWriter writer = new StringWriter(CultureInfo.CurrentCulture))
  4. {
  5. htmlHelper.RenderPartialInternal(partialViewName, viewData, model, writer, ViewEngines.Engines);
  6. return MvcHtmlString.Create(writer.ToString());
  7. }
  8. }

代码就是这样,是不是感觉似曾相识,其实就跟上面说到的代码一样,唯一的区别就是有没有传入数据。详情请看之前附上RenderPartialInternal的代码,就是装填数据然后调用生成视图FindPartialView方法,具体看上面哈,这里就不多说了。

Partial方法说到这里。

2.RenderPartial

反编译工具中对这个扩展类的描述如下:Provides support for rendering a partial view.意思大概是提供支持生成部分页的方法。

这个方法是HtmlHelper的扩展方法,这个方法同样有四个重载,用Reflector工具看下,代码如下:

  1. public static class RenderPartialExtensions
  2. {
  3. // Methods
  4. public static void RenderPartial(this HtmlHelper htmlHelper, string partialViewName);
  5. public static void RenderPartial(this HtmlHelper htmlHelper, string partialViewName, object model);
  6. public static void RenderPartial(this HtmlHelper htmlHelper, string partialViewName, ViewDataDictionary viewData);
  7. public static void RenderPartial(this HtmlHelper htmlHelper, string partialViewName, object model, ViewDataDictionary viewData);
  8. }

有没有感觉跟Partial方法很相似,只是名字不一样。是的,不一样的就是它里面调用的方法,这里就说四个扩展方法中的一个(它们调用的是同一个方法,只是有没有数据的区别),就说下第一个方法代码如下:

  1. public static void RenderPartial(this HtmlHelper htmlHelper, string partialViewName)
  2. {
  3. htmlHelper.RenderPartialInternal(partialViewName, htmlHelper.ViewData, null, htmlHelper.ViewContext.Writer, ViewEngines.Engines);
  4. }

本质的区别就是,在执行了RenderPartialInternal这个方法之后,没有再执行MvcHtmlString.Create(writer.ToString())这个方法,这就是之前说的Partial是返回字符串,而RenderPartial返回的是视图的原因。RenderPartialInternal的代码和Partial方法调用的RenderPartialInternal是一样的。区别直接上图比较直观,如下图1:

                                  图1

从图中可以看出,Partial在生成视图后,将视图写入流中,然后再通过MvcHtmlString.Create方法转为字符串(具体看Partial中的代码),而RenderPartial在调用了RenderPartialInternal方法之后就没有其他操作了(RenderPartialInternal中调用了FinderPartialView方法,此方法中返回View)。

以上就是这两个方法的区别,不知道有没有讲清楚,当然里面还有一些东西我不清楚的,如果大家也意识到那些东西,可以提出来大家一起聊聊,互相学习,多谢。

Html.Partial("")与Html.RenderPartial("")区别的更多相关文章

  1. Html.Partial 和 Html.RenderPartial 、Html.Action 和 Html.RenderAction区别

    Html.Partial 和 Html.RenderPartial不需要为视图指定路径和文件扩展名.因为运行时定位部分视图与定位正常视力使用的逻辑相同.RenderPartial不是返回字符串,而是直 ...

  2. Html.Partial和Html. RenderPartial

    圣殿骑士-蓝剑行动 Html.Partial和Html. RenderPartial用法 Html.Partial和Html. RenderPartial用法 Html.partial和RenderP ...

  3. Html.Partial和Html. RenderPartial用法

    Html.Partial和Html. RenderPartial用法 Html.partial和RenderPartial的用法与区别Html.partial和RenderPartial都是输出htm ...

  4. @Html.Partial和@Html.Action区别

    1.首先看一下它们的对等关系 @Html.Partial 对应 @{Html.RenderPartial();}@Html.Action 对应 @{Html.RenderAction();} 以上相互 ...

  5. MVC中的Html.Partial和Html.RenderPartial

    Partial辅助方法用于将部分视图渲染成字符串.注意没必要为视图指定路径和文件扩展名,因为运行时定位部分视图与定位正常视图使用的逻辑相同.例如,下面代码就渲染一个名为AlbumDisplay的部分视 ...

  6. @Html.Partial 和 @Html.RenderPartial 异同

    相同点:这两个的性质都是一样, 作用都是将View给镶入进来 不同点: Partial 回传的一个Object (MvcHtmlString), 回传一个String 把一堆Html给回传出来, 然后 ...

  7. 【转】Action 、 RenderAction 、 Partial 、 RenderPartial 区别

    1.Action . RenderAction Action 方法以字符串的形式返回子视图,可以直接被呈现.RenderAction方法在适当的地方呈现子视图. //One alternative ( ...

  8. Html.Partial和Html.RenderPartial和Html.RenderAction区别

    1.Html.Partical 把View页或模板解析成字符串然后输出到渲染页面上 @Html.Partical("viewxxx") 2.Html.RenderPartical则 ...

  9. MVC小系列(十二)【RenderAction和RenderPartial区别】

    二者作用:RenderAction:渲染分部视图到页面上,要求提供Action和控制器名称RenderPartial:渲染分部视图到页面上,要求提供分部视图的名称,即路径,如果是在当前控制下或者sha ...

随机推荐

  1. 0.关于TCP协议的一些总结

    接触unix网络编程一年多了,偶尔用户态进程表现出一些不能理解的现象,因此将<TCP/IP协议卷1>TCP协议相关的章节通读了一遍,总结了一下相关的知识点. 1.TCP数据报格式 TCP封 ...

  2. cocos2dx进阶学习之CCObject

    继承关系 CCObject -> CCCopying 类定义 class CC_DLL CCObject : public CCCopying { public: // object id, C ...

  3. H面试程序(28):字符串处理转换

    //2 字符串处理转换 //问题描述: //在给定字符串中找出单词( “单词”由大写字母和小写字母字符构成, //其他非字母字符视为单词的间隔,如空格.问号.数字等等:另外单个字母不算单词): //找 ...

  4. C# ignoring letter case for if statement(Stackoverflow)

    Question: I have this if statement: if (input == 'day') Console.Write({0}, dayData); When the user t ...

  5. NDK如何调试系统核心动态库(无系统源码的情况)

    版权归薛定諤耗子所有,转载请表明出处. 1,有源码,需要导入符号表 2,没有源码,如何调试 1)运行ndk-gdb:../../ndk-gdb --verbose --launch=com.examp ...

  6. 标准I/O库函数的缺陷

    标准IO库存在着两个缺陷.首先,它是在某一台特定类型的机器上实现的,而没有考虑其他的具有不同特性的机器.这样就可能导致在其中的一台机器上运行很好的程序,在另外一台机器上却出现错误,而这其中的原因仅仅是 ...

  7. 【项目分析】利用C#改写JAVA中的Base64.DecodeBase64以及Inflater解码

    原文:[项目分析]利用C#改写JAVA中的Base64.DecodeBase64以及Inflater解码 最近正在进行项目服务的移植工作,即将JAVA服务的程序移植到DotNet平台中. 在JAVA程 ...

  8. javascript真的是异步的吗?且看setTimeout的实现原理以及setTimeout(0)的使用场景

    在今天之前我一直以为setTimeout这个函数是异步的,无意中看到了一篇关于setTimeout的文章.发现自己曾经的认识全是错误的,赶紧总结下. 先看一段代码: var start = new D ...

  9. Activity 和 Intent

    Activity 和 Intent 一.Intent指向Activity 二.利用 Intent 向第二个 Activity 传数据 三.利用 Intent 接受第二个 Activity 的返回值 四 ...

  10. 在Qt中如何使用QtDesigner创建的UI文件

    使用Qt有一些时间了,一直在IDE环境(qtcreator和VS2003+集成器)中使用,自然少了很多麻烦的步骤.但是在享受这种便利的同 时,我们也失去了理解更多知识背后的点滴.在IDE中,如果我们要 ...