使用多个参数(模型和ViewDataDictionary)创建RenderPartialViewToString

时间:2018-09-14 15:18:00

标签: c# asp.net asp.net-mvc

我正在尝试创建一个新函数,该函数将部分视图呈现为包含视图的字符串,模型以及ViewDataDictionary 。我目前正在使用该功能来渲染仅包含模型的局部模型

@Html.Partial("~/Views/Product/ProductQtyPartialView.cshtml", Model, new ViewDataDictionary {{"temp", "1,2"}})

我想创建一个新函数,该函数也可以将字符串的一部分呈现出来,但是还将采用另一个参数(在本例中为ViewDataDictionary)。当我渲染所需的部分图像时,我在cshtml代码中执行以下操作

.wrapper {
  display: grid;
  grid-template-areas:
    "nav nav nav nav nav nav nav nav nav nav nav nav"
    "ft  ft  ft  ft  ft  ft  ft  ft  ft  ft  ft  ft";
  grid-template-columns: repeat(12, 1fr);
  grid-template-rows: repeat(6, 1fr);
  gap: 0.5em;
}

#nav {
  grid-area: nav;
  height: 200px;
  
  /* new */
  display: flex;
  align-items: flex-end;
}

#list {
  list-style: none;
  background: darkcyan;
  
  /* new */
  flex: 1;
}

#footer {
  grid-area: ft;
}

.wrapper > * {
  background: #444;
  color: #fff;
  padding: 1em;
}

在控制器和服务方法中,我想将部分渲染为字符串,以便可以使用更新的部分更新视图。

任何帮助将不胜感激

1 个答案:

答案 0 :(得分:0)

玩了一会儿之后,我就能弄清楚了

   public string RenderPartialViewToStringWithNewData(string viewName, object model, string temp)
    {
        if (string.IsNullOrEmpty(viewName))
            viewName = ControllerContext.RouteData.GetRequiredString("action");

        ViewData.Model = model;
        ViewData["temp"] = temp;

        using (StringWriter sw = new StringWriter())
        {
            ViewEngineResult viewResult = ViewEngines.Engines.FindPartialView(ControllerContext, viewName);
            ViewContext viewContext = new ViewContext(ControllerContext, viewResult.View, ViewData, TempData, sw);
            viewResult.View.Render(viewContext, sw);

            return sw.GetStringBuilder().ToString();
        }
    }

与上面的RenderPartialViewToString函数相同,只是增加了一行

ViewData["temp"] = temp

有了这个新功能,您不必更改视图,就可以像这样调用此功能

RenderPartialViewToStringWithNewData("~/Views/Product/ComponentsPartialView.cshtml", currProduct, temp)