C# Asp.NETMVC中视图的编程呈现和传递查询字符串

C# Asp.NETMVC中视图的编程呈现和传递查询字符串,c#,asp.net,asp.net-mvc,C#,Asp.net,Asp.net Mvc,我能够使用以下代码以编程方式呈现视图: public static string RenderViewToString(string controllerName, string viewName, object viewData, RequestContext requestContext) { using (var writer = new StringWriter()) { var route

我能够使用以下代码以编程方式呈现视图:

 public static string RenderViewToString(string controllerName, string viewName, object viewData, RequestContext requestContext)
        {
            using (var writer = new StringWriter())
            {
                var routeData = new RouteData();

                routeData.Values.Add("controller", controllerName);

                routeData.Values.Add("SkinSrc", "/portals/_default/skins/_default/no%20skin");

                var controllerContext = new ControllerContext(requestContext, new BaseController());

                controllerContext.RouteData = routeData;

                var razorViewEngine = new RazorViewEngine();

                var viewEngineResult = razorViewEngine.FindView(controllerContext, viewName, string.Empty, false);

                var viewContext = new ViewContext(controllerContext, viewEngineResult.View, new ViewDataDictionary(viewData), new TempDataDictionary(), writer);

                viewEngineResult.View.Render(viewContext, writer);

                return writer.GetStringBuilder().ToString();
            }
        }
但是,我希望SkinSrc应该作为查询字符串在url中使用
?SkinSrc=/portals/\u default/skins/\u default/no%20skin


如何才能做到这一点?

我在处理电子邮件时遇到了类似的问题,希望能有所帮助:

string htmlMessage = RenderViewToString("NewsBrodcast", newsBrodcastModel);

    public static string RenderViewToString(string viewPath, object model, bool partial = false, ViewDataDictionary viewDataDictionary = null)
    {
        try
        {
            if (!viewPath.Contains("~/Views/Email"))
            {
                viewPath = "~/Views/Email/" + viewPath + ".cshtml";
            }

            // first find the ViewEngine for this view
            ViewEngineResult viewEngineResult = null;
            if (partial)
                viewEngineResult = ViewEngines.Engines.FindPartialView(FakeControllerContext, viewPath);
            else
                viewEngineResult = ViewEngines.Engines.FindView(FakeControllerContext, viewPath, null);

            if (viewEngineResult == null)
                throw new FileNotFoundException("View cannot be found.");

            if (viewDataDictionary == null)
                viewDataDictionary = new ViewDataDictionary();

            // get the view and attach the model to view data
            var view = viewEngineResult.View;
            viewDataDictionary.Model = model;

            using (var sw = new StringWriter())
            {
                var ctx = new ViewContext(FakeControllerContext, view, viewDataDictionary, FakeControllerContext.Controller.TempData, sw);
                view.Render(ctx, sw);
                return sw.ToString();
            }
        }
        catch (Exception)
        {               
            throw;
        }
    }



    public static HttpContext FakeHttpContext()
    {
        var httpRequest = new HttpRequest("", "https://example.com/", "");
        var stringWriter = new StringWriter();
        var httpResponse = new HttpResponse(stringWriter);
        var httpContext = new HttpContext(httpRequest, httpResponse);

        var sessionContainer = new HttpSessionStateContainer("id", new SessionStateItemCollection(),
            new HttpStaticObjectsCollection(), 10, true,
            HttpCookieMode.AutoDetect,
            SessionStateMode.InProc, false);

        httpContext.Items["AspSession"] = typeof(HttpSessionState).GetConstructor(
                BindingFlags.NonPublic | BindingFlags.Instance,
                null, CallingConventions.Standard,
                new[] { typeof(HttpSessionStateContainer) },
                null)
            .Invoke(new object[] { sessionContainer });

        return httpContext;
    }

    private static HttpContext Ctx => HttpContext.Current ?? FakeHttpContext();


    private static ControllerContext _fakeControllerContext;
    private static ControllerContext FakeControllerContext
    {
        get
        {
            var routeData = new RouteData();
            routeData.Values.Add("controller", "Fake");
            _fakeControllerContext = new ControllerContext(new HttpContextWrapper(Ctx), routeData, new FakeController());
            return _fakeControllerContext;
        }
    }
    private class FakeController : ControllerBase { protected override void ExecuteCore() { } }

非常感谢。但是,您正在使用反射创建新会话。那么,在提出请求时,我的当前会话不会被使用吗?我认为,您可以使用自己的上下文,将FakeControllerContext更改为您自己的上下文。我使用了FakeControllerContext,因为我需要在后台渲染视图,而不需要前端向控制器发出任何请求