zoukankan      html  css  js  c++  java
  • mvc4 @Html.Partial,@Html.RenderPartial

    两者都可以输出一个Partial视图;其区别如下: 1. Partial有返回值(MvcHtmlString);RenderPartial没有返回值(Void)。

    先看看Partial方法的实现。

    复制代码
     public static MvcHtmlString Partial(this HtmlHelper htmlHelper, string partialViewName, object model, ViewDataDictionary viewData)
            {
                using (StringWriter writer = new StringWriter(CultureInfo.CurrentCulture))
                {
                    htmlHelper.RenderPartialInternal(partialViewName, viewData, model, writer, ViewEngines.Engines);
                    return MvcHtmlString.Create(writer.ToString());
                }
            }
    复制代码

    会创建一个MvcHtmlString对象返回,具体的就是实例化一个带有一个value参数的MvcHtmlString对象返回,这个value参数就是调用到的部分视图下的字符串。

    而RenderPartial方法:

     public static void RenderPartial(this HtmlHelper htmlHelper, string partialViewName)
            {
                htmlHelper.RenderPartialInternal(partialViewName, htmlHelper.ViewData, null /* model */, htmlHelper.ViewContext.Writer, ViewEngines.Engines);
            }

    从这两行代码可以看到都调用的是htmlHelper.RenderPartialInternal方法,一个将输出的字符串用MvcHtmlString封装了下,具体看看htmlHelper.RenderPartialInternal方法里做了些什么:

     view.Render(newViewContext, writer);

    上面那个方法是最后的调用该方法需要的参数是ViewContext和TextWriter对象,其实就是相关联的上下文和字符串文本。而这个方法里又调用了它

    复制代码
    public void Render(ViewContext viewContext, TextWriter writer)
            {
               ...
                object instance = null;
               ...
                }
                RenderView(viewContext, writer, instance);
            }
    复制代码

    这里第三个参数的创建过程在此可以不用考虑,

    复制代码
    protected override void RenderView(ViewContext viewContext, TextWriter writer, object instance)
            {
                ...
                WebViewPage webViewPage = instance as WebViewPage;            
                ...
                webViewPage.OverridenLayoutPath = LayoutPath;
                webViewPage.VirtualPath = ViewPath;
                webViewPage.ViewContext = viewContext;
                webViewPage.ViewData = viewContext.ViewData;
                ....
                webViewPage.InitHelpers();
                ... 
                 webViewPage.ExecutePageHierarchy(new WebPageContext(context: viewContext.HttpContext, page: null, model: null), writer, startPage);
            }   
    复制代码

    上面可以看到会将参数instance强制转换为webViewPage对象。该对象下的InitHelpers()我们懂的,就是给页面上那几个Html/Ajax/Url属性赋值。

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

    上图两个调用将会呈现一样的效果。

  • 相关阅读:
    什么是垃圾回收
    Oracle GoldenGate学习之Goldengate介绍
    JVM虚拟机选项:Xms Xmx PermSize MaxPermSize区别
    查看linux系统版本命令
    Case when 的用法,简单Case函数
    case when then else end
    ORACLE视图添加备注
    修改 tomcat 内存
    Linux 内存机制详解宝典
    oracle正则表达式regexp_like的用法详解
  • 原文地址:https://www.cnblogs.com/zcm123/p/3123335.html
Copyright © 2011-2022 走看看