如何在我的 ASP.NET MVC 应用程序中使用 ACE?

Posted

技术标签:

【中文标题】如何在我的 ASP.NET MVC 应用程序中使用 ACE?【英文标题】:How do I use ACE with my ASP.NET MVC application? 【发布时间】:2012-01-10 17:54:28 【问题描述】:

我想在我的项目中使用ACE 在线代码编辑器。如何在 ASP.NET MVC 中使用它?

我想将使用该编辑器所做的任何编辑保存在数据库中。我该怎么做?

【问题讨论】:

【参考方案1】:

假设您有一个强类型模型,其中包含一个名为Editor 的属性,其中包含数据。现在使用普通的<div> 来加载数据:

<div id="editor"><%=Model.Editor %></div>

现在您可以使用 javascript 创建一个 ace 编辑器来代替 div:

<script src="src/ace.js" type="text/javascript" charset="utf-8"></script>
<script>
window.onload = function() 
    var editor = ace.edit("editor");
;
</script>

现在,当您想要保存数据时,例如通过表单发布,使用类似这样的方法将其绑定回模型的 Editor 属性:

<%=html.HiddenFor(m=>m.Editor, new  @id = "hidden_editor" ) %>

<!-- this is jQuery, but you can use any JS framework for this -->
<script>
    $("form").submit(function () 
        $("#hidden_editor").val(editor.getSession().getValue());
    );
</script>

在您的控制器中,您现在可以将数据保存到数据库中

[HttpPost]
public ActionResult Index (IndexModel model) 
    var data = model.Editor;
    // save data in database

【讨论】:

【参考方案2】:

这是使用最新技术(Razor/MVC/Ajax)的解决方案:

    $(document).ready(function() 
        $("#btnSave").on("click", function ()                 
                $.ajax(
                    url: '@Url.Action("YourAction", "YourController")',
                    type: 'POST',
                    data:  id: @Model.ID,
                            html: ace.edit("editor").getValue() ,
                    cache: false,
                    success: function (response) 
                        alert("Changes saved.");
                                            
                );
        );
    );

在控制器中:

    [AjaxAuthorize]
    [HttpPost, ValidateInput(false)]
    public ActionResult YourAction(string id, string html)
    
        if (id == null || String.IsNullOrEmpty(id))
        
            return new HttpStatusCodeResult(HttpStatusCode.BadRequest);
        
        // do you stuff
    

【讨论】:

【参考方案3】:

这就是我最终在 Razor Views 中这样做的方式

@model OfficeGx.Cms.Model.ClassName
<div class="form-group row">
    <div class="col-lg-11">
        @Html.HiddenFor(x => x.CascadingStylesHdn, new  @id = "hidden_cssEditor" )
        @Html.LabelFor(x=>x.CascadingStyles)
        <div id="cssEditor">@Model.CascadingStyles</div>
    </div>
</div>
<div class="form-group row">
    <div class="col-lg-11">
        @Html.HiddenFor(x => x.JavaScriptHdn, new  @id = "hidden_jsEditor" )
        @Html.LabelFor(x => x.JavaScript)
        <div id="jsEditor">@Model.JavaScript</div>
    </div>
</div>
<script>
    var cssEditor;
    var jsEditor;
    window.onload = function() 
        cssEditor = ace.edit("cssEditor");
        cssEditor.getSession().setMode("ace/mode/css");
        cssEditor.setTheme("ace/theme/twilight");

        jsEditor = ace.edit("jsEditor");
        jsEditor.getSession().setMode("ace/mode/javascript");
        jsEditor.setTheme("ace/theme/xcode");
    ;
    $("form").submit(function () 
        $("#hidden_cssEditor").val(window.cssEditor.getSession().getValue());
        $("#hidden_jsEditor").val(window.jsEditor.getSession().getValue());
    );
</script>
<style>
    #cssEditor, #jsEditor 
        position: relative;
        height: 400px
    

    @Model.CascadingStyles
</style>

在我的控制器中添加/编辑方法

[HttpPost]
        [ValidateInput(false)]
        public ActionResult AddEdit(Article article, FormCollection formCollection)
        
            article.CompanyId = OperatingUser.CompanyId;
            article.CascadingStyles = article.CascadingStylesHdn;
            article.JavaScript = article.JavaScriptHdn;

【讨论】:

以上是关于如何在我的 ASP.NET MVC 应用程序中使用 ACE?的主要内容,如果未能解决你的问题,请参考以下文章

如何在我的 ASP.NET MVC 应用程序中实现“全选”复选框?

如何在我的实体框架和 ASP.NET MVC 项目中重构 connectionString?

如何在 ASP.NET MVC 应用程序中将图像上传到 cloudinary?

如何解决我的 ASP.Net MVC 应用程序中的 iisreset 后发生的 AntiForgeryToken 异常?

如何将我的请求中的安全主体传递到 asp.net MVC 中的线程中

在 ASP.NET MVC 中实现“记住我”功能