asp.net mvc源码分析-RenderAction和RenderPartial

本文深入剖析了ASP.NET MVC中RenderAction和RenderPartial的方法实现,通过源码分析,揭示了两者之间的区别,以及如何在实际开发中使用它们。RenderPartial主要涉及内部ViewContext的创建和渲染,而RenderAction则涉及到额外的路由信息处理和HTTP处理。通过对比,指出RenderPartial由于无需发起HTTP请求,因此性能更优。
摘要由CSDN通过智能技术生成

截止上篇文章asp.net mvc源码分析-ActionResult篇 RazorView.RenderView 相信大家对mvc的大致流程应该有所了解。现在我们来看看我们在mvc开发中用的最多的几个方法,我想排在第一的应该是Html.RenderActionHtml.RenderPartial吧。先说简单的吧:RenderPartial和Partial

 public static void RenderPartial(this HtmlHelper htmlHelper, string partialViewName, object model, ViewDataDictionary viewData) {
            htmlHelper.RenderPartialInternal(partialViewName, viewData, model,htmlHelper.ViewContext.Writer, ViewEngines.Engines);
        }

  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());
            }
        }

从这里我们可以知道RenderPartial和Partial它们返回的东西写到的流不一致,一个是当前的writer,一个是新建的writer,当然新建的writer便于返回字符文本。

  internal virtual void RenderPartialInternal(string partialViewName, ViewDataDictionary viewData, object model, TextWriter writer, ViewEngineCollection viewEngineCollection) {
            if (String.IsNullOrEmpty(partialViewName)) {
                throw new ArgumentException(MvcResources.Common_NullOrEmpty, "partialViewName");
            }
            ViewDataDictionary newViewData = null;
            if (model == null) {
                if (viewData == null) {
                    newViewData = new ViewDataDictionary(ViewData);
                }
                else {
                    newViewData = new ViewDataDictionary(viewData);
                }
            }
            else {
                if (viewData == null) {
                    newViewData = new ViewDataDictionary(model);
                }
                else {
                    newViewData = new ViewDataDictionary(viewData) { Model = model };
                }
            }


            ViewContext newViewContext = new ViewContext(ViewContext, ViewContext.View, newViewData, ViewContext.TempData, writer);
            IView view = FindPartialView(newViewContext, partialViewName, viewEngineCollection);
            view.Render(newViewContext, writer);
        }

看看 是不是很简单,而这里的FindPartialView其实核心代码就一句,

      ViewEngineResult result = viewEngineCollection.FindPartialView(viewContext, partialViewName);我们从前面的文章中知道FindView 和FindPartialView的逻辑是一致的。

现在 我们来看看RenderAction和 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值