C# 获取当前页面html并设置隐藏字段(MVC4)

C# 获取当前页面html并设置隐藏字段(MVC4),c#,asp.net-mvc-4,C#,Asp.net Mvc 4,我试图捕获当前页面的Html,想知道如何使用razor语法设置hiddenfield 我想设定 @Html.Hidden("pageHtml") 我目前正在使用javascript获取页面html,但我想尝试使用@html属性或其他类似的东西 var html1 = $('#wrapper').html(); var encodedString = escape(html1); $('#pageHtml').val(encodedString); 或者,如果有人可以帮助我找到一种方法,在控制

我试图捕获当前页面的Html,想知道如何使用razor语法设置hiddenfield

我想设定

@Html.Hidden("pageHtml")
我目前正在使用javascript获取页面html,但我想尝试使用@html属性或其他类似的东西

var html1 = $('#wrapper').html();
var encodedString = escape(html1);
$('#pageHtml').val(encodedString);
或者,如果有人可以帮助我找到一种方法,在控制器操作中获取当前视图html


请提出一些建议

首先,创建一个控制器扩展方法
ViewToString
,如下所示:
这将扩展System.Web.Mvc.Controller,使其具有名为
ViewToString
的新方法,并将视图HTML呈现到StringReader中

namespace YourProject.ControllerExtensions
{
    using System;
    using System.IO;
    using System.Web.Mvc;
    public static class ControllerExtend
    {
        public static StringReader ViewToString(this Controller controller, string viewName, object model)
        {
            #region MyRegion
            ControllerContext context = controller.ControllerContext;
            if (context == null)
            {
                throw new ArgumentNullException("context");
            }
            if (model != null)
            {
                controller.ViewData.Model = model;
            }
            using (var sw = new StringWriter())
            {                
                var viewResult = ViewEngines.Engines.FindPartialView(context, viewName);
                var viewContext = new ViewContext(context, viewResult.View, controller.ViewData, controller.TempData, sw);
                viewResult.View.Render(viewContext, sw);
                viewResult.ViewEngine.ReleaseView(context, viewResult.View);


                //return sw.GetStringBuilder().ToString();
                return new StringReader(sw.ToString());

            }
            #endregion
        }


    }
}
现在,在控制器操作中调用上述方法以访问视图HTML并传递
视图名称
模型名称
(如果没有模型,则传递null):

htmlView将包含您视图中的HTML


希望这会有所帮助…

所以我们最终就是这样做的…(我们的页面不包含任何安全数据,所以我们已经开始这样做了)

  • 添加了一个隐藏字段来保存html
  • 使用javascript方法设置带有编码页面html的隐藏字段 var html1=$('#wrapper').html(); var encodedString=escape(html1)

  • 将控制器更改为将隐藏字段作为参数。(传递编码的html)

  • 使用

    var html=System.Uri.UnescapeDataString(pageHtml)


您能提供更多关于您正在尝试做什么的信息吗?如果要编辑控制器中元素的值。。将其设置为模型属性并使用
@Html.HiddenFor(x=>x.property)
…我需要页面的Html来创建完整的电子邮件附件。问题是我将如何设置模态属性。您的问题非常不清楚。。请对其进行编辑,以便更好地解释您试图实现的目标(对于一个非常不清楚的问题,请给出一个很好的答案!)只有一个疑问:为什么是StringReader?为什么不用绳子?谢谢你,麦迪。我们也在做同样的事情(见我回答的问题),但只是想看看是否有一种直接的方法来做这件事。@LorenzoDematté在每一条评论中提到的问题都不清楚,这对我或任何人都没有帮助。我的问题很简单,因此没有提供大的细节。@fireholster实际上,把你的问题弄清楚会帮助你得到更好的答案。此外,它还将有利于其他人,他们将在你寻找类似的问题。简单地编辑问题以包含您的第一条评论已经是一个很大的改进!ViewToString的输出可以是String、StringReader或StringBuilder,具体取决于您将如何使用。我打算对输出进行流式处理,并从HTML创建PDF,StringBulder和StringReader对我来说是更好的选择。一般来说,如果有很多字符串操作,StringBuilder是一个更好的选择。
public ActionResult YourControllerAction()
{

    //....      
    StringReader htmlView = this.ViewToString("YourViewName", YourModelObject);    
    //Now htmlView containing the HTML of Your View 
    //and you can pass it to your Email function .....
// ...

}