tinymce在mvc 3 razor中,Ajax.ActionLinks在第一次Ajax调用后失败

tinymce在mvc 3 razor中,Ajax.ActionLinks在第一次Ajax调用后失败,ajax,asp.net-mvc,razor,tinymce,Ajax,Asp.net Mvc,Razor,Tinymce,我正在asp.net mvc 3 Razor应用程序中使用Tinymce。ActionLink通过调用名为“GetContent”的控制器操作加载tinymce编辑器。GetContent方法从文件系统加载文本文件。一切都很好。但是,在通过$.ajax调用保存tinymce文本之后,ajax.ActionLink不再触发控制器方法。换句话说,$.ajax帖子中的某些内容会破坏客户端上的ajax.ActionLink,使其不再调用GetContent控制器操作 有趣的是,Ajax.ActionLi

我正在asp.net mvc 3 Razor应用程序中使用Tinymce。ActionLink通过调用名为“GetContent”的控制器操作加载tinymce编辑器。GetContent方法从文件系统加载文本文件。一切都很好。但是,在通过$.ajax调用保存tinymce文本之后,ajax.ActionLink不再触发控制器方法。换句话说,$.ajax帖子中的某些内容会破坏客户端上的ajax.ActionLink,使其不再调用GetContent控制器操作

有趣的是,Ajax.ActionLink仍然从浏览器缓存加载tinymce编辑器。在下面的示例中,我有两个链接“FileOne”和“FileTwo”,它们加载两个不同的文本文件。在调用$.ajax之前,链接从磁盘加载文件。调用$.ajax后,链接从浏览器缓存加载最后一个“FileOne”或“FileTwo”

这就是观点。$.ajax post出现在tiny_mce_save_click()函数中,该函数连接到tinymce save按钮click:

        @model TestTinyMCE.Models.HomeModel
    @{
        ViewBag.Title = "Home Page";
    }
    @section JavaScript
    {
        <script src="@Url.Content("~/Scripts/tiny_mce/jquery.tinymce.js")" type="text/javascript"></script>
        <script src="@Url.Content("~/Scripts/jquery.unobtrusive-ajax.min.js")" type="text/javascript"></script>
        <script type="text/javascript">
            $().ready(function () {
                init_tiny_mce();
            });
            function init_tiny_mce() {
                $('textarea.tinymce').tinymce({
                    // Location of TinyMCE script
                    script_url: '/Scripts/tiny_mce/tiny_mce.js',

                    //javascript function called when tinymce save button is clicked.
                    save_onsavecallback: "tiny_mce_save_click",

                    encoding: "xml",

                    theme: "advanced",
                    plugins: "save",
                    theme_advanced_buttons1: "save",
                    theme_advanced_toolbar_location: "top"
                });
            }
            function tiny_mce_save_click(tinyMceInstance) {
                $.ajax({
                    type: 'POST',
                    url: '/Home/SaveContent',
                    data: $('form').serialize(),
                    success: function (data, status, xml) {
                        $('#results').html(data);
                    },
                    error: function (xml, status, error) {
                        $('#results').html(error);
                    }
                });

                return false;
            }
        </script>
    }
    @using (Html.BeginForm())
    {
        <ul>
            @foreach (string fileName in Model.FileList)
            {
                <li>@Ajax.ActionLink(fileName, "GetContent", new { FileName = fileName }, new AjaxOptions() { UpdateTargetId = "divContent" })</li>
            }
        </ul>

        <div id="divContent">
            @Html.Partial("GetContent", Model)
        </div>
    }

问题在于broswer缓存。要防止在Ajax.ActionLink上进行缓存,必须添加AjaxOption HttpMethod=“POST”。在上面的代码中,将ActionLink更改为

<li>@Ajax.ActionLink(fileName, "GetContent", new { FileName = fileName }, new AjaxOptions() { UpdateTargetId = "divContent", HttpMethod = "POST" })</li>. 
  • @Ajax.ActionLink(文件名,“GetContent”,新的{fileName=fileName},新的AjaxOptions(){UpdateTargetId=“divContent”,HttpMethod=“POST”})

  • 请参阅找到了答案--必须通过添加AjaxOption HttpMethod=“POST”来防止在Ajax.ActionLink上进行缓存。在上面的代码中,将ActionLink更改为
  • @Ajax.ActionLink(fileName,“GetContent”,new{fileName=fileName},new AjaxOptions(){UpdateTargetId=“divContent”,HttpMethod=“POST”})
  • 。请参阅+1以介绍解决方案(您可以将其添加为答案并接受)
        using System;
            using System.Collections.Generic;
            using System.Linq;
            using System.Web;
            using System.Web.Mvc;
            using TestTinyMCE.Models;
    
            namespace TestTinyMCE.Controllers
            {
                public class HomeController : Controller
                {
                    public ActionResult Index()
                    {
                        return View(new HomeModel());
                    }
    
                    public ActionResult GetContent(HomeModel homeModel)
                    {
                        if (!string.IsNullOrEmpty(homeModel.FileName))
                        {
                            string path = string.Format("~/App_Data/{0}.htm", homeModel.FileName);
                            string physicalPath = Server.MapPath(path);
                            if (!System.IO.File.Exists(physicalPath))
                                homeModel.Content = string.Format("The file '{0}' does not exist.", physicalPath);
                            else
                                homeModel.Content = System.IO.File.ReadAllText(physicalPath);
                        }
                        return View(homeModel);
                    }
    
                    [HttpPost]
                    [ValidateInput(false)]
                    public ActionResult SaveContent(HomeModel homeModel)
                    {
                        string path = string.Format("~/App_Data/{0}.htm", homeModel.FileName);
                        string physicalPath = Server.MapPath(path);
                        System.IO.File.WriteAllText(physicalPath, homeModel.Content);
                        ViewBag.Result = "The file was successfully saved.";
                        return View();
                    }
                }
            }
    
    <li>@Ajax.ActionLink(fileName, "GetContent", new { FileName = fileName }, new AjaxOptions() { UpdateTargetId = "divContent", HttpMethod = "POST" })</li>.