tinymce в mvc 3 бритва, Ajax.ActionLinks терпят неудачу после первого вызова ajax - PullRequest
3 голосов
/ 02 сентября 2011

Я использую Tinymce внутри приложения Razor asp.net mvc 3.Ajax.ActionLink загружает редактор tinymce посредством вызова действия контроллера с именем «GetContent».Метод GetContent загружает текстовый файл из файловой системы.Все хорошо.Но после того как я сохранил текст tinymce с помощью вызова $ .ajax, Ajax.ActionLink больше не запускает метод контроллера.Другими словами, что-то в посте $ .ajax нарушает Ajax.ActionLink на клиенте, так что он больше не вызывает действие контроллера GetContent.

Интересно, что Ajax.ActionLink по-прежнему загружает редактор tinymce, но из кеша браузера.В приведенном ниже примере у меня есть 2 ссылки «FileOne» и «FileTwo», которые загружают два разных текстовых файла.Прежде чем я позвоню $ .ajax, ссылки загружают файл с диска.После того, как я вызываю $ .ajax, ссылки загружают последний «FileOne» или «FileTwo» из кэша браузера.

Это представление.Сообщение $ .ajax происходит внутри функции tiny_mce_save_click (), которая подключена к нажатию кнопки сохранения tinymce:

        @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>
    }

Частичное представление «GetContent»:

    @model TestTinyMCE.Models.HomeModel
        @{
            Layout = null;
        }
        <div id="divContent">
            <fieldset id="fsContent">
                <span id="results"></span><legend>Edit Content &nbsp; @Html.DisplayTextFor(m => m.FileName)</legend>
                @Html.TextAreaFor(m => m.Content,
                new Dictionary<string, object>{
                    {"class","tinymce"}, {"cols","80"}, {"rows","10"}}
                    )
                @Html.HiddenFor(m => m.FileName)
            </fieldset>
            @if (@IsAjax)
            {
                <text>
                <script type="text/javascript">init_tiny_mce();</script>
                </text>
            }
        </div>

Этоэто контроллер.Метод GetContent больше не вызывается после появления сообщения $ .ajax:

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

1 Ответ

0 голосов
/ 12 марта 2014

Проблема заключается в более широком кэшировании. Чтобы предотвратить кэширование на Ajax.ActionLink, вы должны добавить AjaxOption HttpMethod = "POST". В приведенном выше коде измените ActionLink на

<li>@Ajax.ActionLink(fileName, "GetContent", new { FileName = fileName }, new AjaxOptions() { UpdateTargetId = "divContent", HttpMethod = "POST" })</li>. 

См. http://forums.asp.net/t/1681358.aspx?Disable+cache+in+Ajax+ActionLink+extension+method+in+asp+net+MVC

...