gpt4 book ai didi

c# - 分部 View 转 Html 字符串

转载 作者:行者123 更新时间:2023-11-30 14:30:44 25 4
gpt4 key购买 nike

我有一个工作流程,它使用 signalR 在数据从服务传入时更新页面。目前流程如下:

Service -> SignalR Hub           Controller
v ^ v
View Partial

上面一行是服务端,下面一行是客户端。我使用 signalR 实现我的 jquery 函数,该函数使用 AJAX 从 Controller 获取部分 View 并更新页面。

看来我可以将这个过程缩短为:

Service -> Controller -> SignalR Hub
v
View

Controller 会将部分 View 的字符串表示形式发送到 SignalR Hub。

我的问题是试图获取局部 View 的字符串表示形式。我环顾四周,发现了这段代码:

protected string RenderPartialViewToString(string viewName, object model)
{
if (string.IsNullOrEmpty(viewName))
viewName = ControllerContext.RouteData.GetRequiredString("action");

ViewData.Model = model;

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

但是这需要 ControllerContext,它对我来说总是空的,因为我不是从客户端调用这个方法。我还没有找到一种在没有 ControllerContext 的情况下呈现局部 View 的方法。可以这样做吗?

最佳答案

评论中链接的答案是一种方法。我偶然发现了另一种方式 page : 创建一个虚假的 Controller 上下文。我刚刚在过去几周自己实现了这个,并且运行良好。

public static T CreateController<T>(RouteData routeData = null)
where T : Controller, new()
{
// create a disconnected controller instance
T controller = new T();

// get context wrapper from HttpContext if available
HttpContextBase wrapper;
if (System.Web.HttpContext.Current != null)
wrapper = new HttpContextWrapper(System.Web.HttpContext.Current);
else
throw new InvalidOperationException(
"Can't create Controller Context if no "+
"active HttpContext instance is available.");

if (routeData == null)
routeData = new RouteData();

// add the controller routing if not existing
if (!routeData.Values.ContainsKey("controller") &&
!routeData.Values.ContainsKey("Controller"))
routeData.Values.Add("controller",
controller.GetType()
.Name.ToLower() .Replace("controller", ""));

controller.ControllerContext = new ControllerContext(wrapper, routeData, controller);
return controller;
}

因此,您将像这样更新您的代码:

protected string RenderPartialViewToString(ControllerContext context, string viewName, object model)
{
if (string.IsNullOrEmpty(viewName))
viewName = context.RouteData.GetRequiredString("action");

ViewData.Model = model;

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

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

然后这样调用它:

//can include RouteData parameter here if needed...
var bogusController = Util.CreateController<YourControllerType>();
var partialViewGuts = RenderPartialViewToString(bogusController.Context, "view", model);

关于c# - 分部 View 转 Html 字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22098233/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com