首页 > 解决方案 > 如何在 MVC C# 项目中使用单独的 Javascript 文件在 Ajax 调用中正确使用 url

问题描述

在我的项目中,我有一个按钮可以保存 html 页面的更改内容。

该按钮如下所示:

<button class="btn btn-light" title="Export (Ctrl + E)" id="save-btn" data-hmi-action="saveAjax"  data-hmi-shortcut="ctrl+e">
     <i class="la la-save"></i>
</button>

外部文件中的 saveAjax 分为几个部分。

saveAjax: function(fileName, startTemplateUrl, callback)
{
    var data = {};
    data["fileName"] = (fileName && fileName != "") ? fileName : HMI.FileManager.getCurrentUrl();
    data["startTemplateUrl"] = startTemplateUrl;
    if (!startTemplateUrl || startTemplateUrl == null)
    {
        data["html"] = this.getHtml();
    }
    console.log(data);
    $.ajax({
        type: "POST",
        url: 'Home/Save', //set your server side save script url
        data: data,
        cache: false,
        success: function (data) {

            if (callback) callback(data);

        },
        error: function (data) {
            alert(data.responseText);
        }
    });                 
}

上面的 url 是我的控制器操作。执行时,它会在控制台中的 url 上给出错误 500。我在控制器中设置了一个中断,正如预期的那样,它绕过了它。

第二部分如下:

saveAjax : function () {

    var url = Hmi.FileManager.getCurrentUrl();

    return Hmi.Builder.saveAjax(url, null, function (data) {
        $('#message-modal').modal().find(".modal-body").html("File saved at: " + data);
    });     
}

我已经尝试在按钮的剃须刀页面上使用 url,但是由于这已经调用了 saveAjax 页面并且它不是基于 Id 的调用,所以这将不起作用。控制台中的 url 是正确的 url,这意味着它会到达正确的位置。我认为它正在寻找一个名为 Save 的页面,而不是转到 ActionResult。在这种情况下,我不需要对此进行查看。

我想看看我是否正确地寻找页面而不是 ActionResult,如果是的话,有没有办法让我查看 ActionResult 而不是页面。

也许是一种将某些东西传递给获取 url 的 javascript 文件然后在 saveAjax 脚本中使用它的方法。

下面要添加的是用于项目中所有按钮的 data-hmi-action。

init: function() {
    $("[data-hmi-action]").each(function () {
        on = "click";
        if (this.dataset.hmiOn) on = this.dataset.hmiOn;

        $(this).on(on, HMI.Gui[this.dataset.hmiAction]);
        if (this.dataset.hmiShortcut)
        {
            $(document).bind('keydown', this.dataset.hmiShortcut, HMI.Gui[this.dataset.hmiAction]);
            $(window.FrameDocument, window.FrameWindow).bind('keydown', this.dataset.hmiShortcut, HMI.Gui[this.dataset.hmiAction]);
        }
    });
}

谢谢你的帮助!

编辑 - -

在这种特殊情况下,我遇到了 500 服务器错误,因为我试图捕获页面上的 HTML / Javascript。Dot Net 扫描该信息以查找虚构字符。代码标记看起来好像有人传递了信息以及您试图发送的威胁信息。

它可以被禁用。就我而言,它正在添加

[ValidateInput(false)] 

到控制器动作。您还可以通过在 web.config 文件中使用来覆盖整个应用程序。

<system.web>
  <httpRuntime requestValidationMode="2.0" />
</system.web>   

在不同的应用程序中还有其他方法可以做到这一点,此示例仅适用于 MVC。您可以查看下面的地址以获取有关其他应用程序的更多详细信息。

MSDN

标签: javascriptc#ajaxmodel-view-controller

解决方案


推荐阅读