3

我目前正在 ASP.NET 中编写 ContentManager。我有一个预览按钮,它使用 jQuery 将表单数据发布到新窗口并显示页面的外观而不将其保存到数据库并影响实时站点。虽然让 ASP.NET 直接发布到我尝试预览的页面有点麻烦,但我终于使用一系列 jQuery 代码解决了所有问题。它工作得很好,我使用 Request.Form 将所有帖子值加载到页面中并将它们显示在页面上。不幸的是,由于某种原因,我使用的 Telerik RadEditor 向我发布了它们在 C# Page_Load 事件中分配的值,并且没有反映我所做的文本更改。如果有人可以帮助我,那就太好了。

function showPreview()
{
    url = "<%= (SiteManager.GetSite()).Url  + this.Filename %>?preview=true"; 
    var specs = "width=1010,height=700,location=0,resizeable=1,status=1,scrollbars=1"; 
    window.open(url, 'PagePreview', specs).moveTo(25, 25);
    $("#__VIEWSTATE").remove();
    $("#__EVENTTARGET").remove();
    $("#__EVENTARGUMENT").remove();
    $("#aspnetForm").removeAttr("action");
    $("#aspnetForm").attr("target","PagePreview");
    $("#aspnetForm").attr("action", url);
    $("#aspnetForm").submit(); 
}

这是我从 tererik RADEDITOR 收到的所有帖子数据::

[ctl00_MainContentPlaceHolder_SideContentRadEditor_dialogOpener_Window_ClientState] => [ctl00_MainContentPlaceHolder_SideContentRadEditor_dialogOpener_ClientState] => [ctl00$MainContentPlaceHolder$SideContentRadEditor] => [ctl00_MainContentPlaceHolder_SideContentRadEditor_ClientState] => [ctl00_MainContentPlaceHolder_ContentRadEditor_dialogOpener_Window_ClientState] => [ctl00_MainContentPlaceHolder_ContentRadEditor_dialogOpener_ClientState] => [ctl00$MainContentPlaceHolder$ContentRadEditor] => %3cp%3eTestPageContent%3c/p%3e 

这是文本编辑器的 html 值(如上所示)%3cp%3eTestPageContent%3c/p%3e 这是在 Page_Load 事件期间加载的 RadEditor 中的值。

我将值更改为“测试”。但它不是通过 POST 请求发送的,它发送的是页面加载中加载的内容。

4

2 回答 2

5

编辑器内容区域与用于在 POST 请求期间提交内容的文本区域分开。提交表单时,编辑器将自动尝试将内容保存在隐藏的文本区域中,但在您的情况下,不会触发任何事件,因为它以编程方式发生(即您调用 .submit())。在进行回发之前,您需要告诉编辑器手动保存其内容。代码非常基础——获取编辑器的引用并调用 .saveContent():

//Grab a reference to the editor
var editor = $find("<%=theEditor.ClientID%>");

//Store the content in the hidden textarea so it can be posted to the server
editor.saveContent();
于 2011-10-03T06:56:08.410 回答
0

一种解决方案是在您的方法中获取编辑器中的当前 HTMLshowPreview并手动传递。为此,请在页面中添加一个隐藏的输入元素来保存 HTML 内容:

<input type="hidden" id="htmlContent" name="htmlContent" />

然后,您可以intput像这样在 showPreview 中设置它的值:

function showPreview()
{
    url = "<%= (SiteManager.GetSite()).Url  + this.Filename %>?preview=true"; 
    var specs = "width=1010,height=700,location=0,resizeable=1,status=1,scrollbars=1"; 
    window.open(url, 'PagePreview', specs).moveTo(25, 25);
    $("#__VIEWSTATE").remove();
    $("#__EVENTTARGET").remove();
    $("#__EVENTARGUMENT").remove();

    //   *** Begin New Code ***
    //Grab a reference to the editor
    var editor = $find("<%=theEditor.ClientID%>");

    //Get the current HTML content
    var html = editor.get_html()

    //Put that HTML into this input so it will get posted
    $("#htmlContent").val(html);
    //    *** End New Code ***

    $("#aspnetForm").removeAttr("action");
    $("#aspnetForm").attr("target","PagePreview");
    $("#aspnetForm").attr("action", url);
    $("#aspnetForm").submit(); 
}

然后,当您想在回发期间获取 HTML 时,您可以使用Request.Form["htmlContent"]

一个警告:由于您将发布原始 HTML,ASP.NET 的请求验证可能会导致问题。该验证的主要目的之一是确保 HTML 内容不会被发送回服务器——这正是您想要完成的事情。您当然可以关闭验证(参见上面的链接),但验证是有原因的。另一种解决方案可能是在发布之前对 HTML 进行一些基本编码。如果您只是在发布之前将所有小于号 (<) 替换为某些内容,那么 ASP.Net 会很高兴。然后你只需要在回发期间“取消替换”它。

于 2011-10-01T07:56:46.330 回答