javascript - 尚未找到函数 SubmitSurvey 的定义,但我定义了它

标签 javascript jquery .net asp.net-mvc razor

这实际上是我尝试解决这个问题的第五天。

我尝试通过 Razor View 中的按钮调用方法,没有重定向到其他 View ,只是在单击按钮时调用一个简单的方法。

脚本如下:

<script>
   function SubmitClick () {
        var pid = $(this).data('personid');
        var sid = $(this).data('surveyid');
        var url = '@Url.Action("SubmitSurvey", "Person")';
        $.post(url, { personid: pid, surveyid: sid }, function (data) {
            alert('updated');
        });
    };
</script>

按钮看起来像:

  <button class='mybutton' type='button' data-personid="@Model.Item1.Id" data-surveyid="@survey.Id" onclick="javascript:SubmitClick()">Click Me</button>

PersonController 方法如下所示:

public void SubmitSurvey(int personId, int surveyId) {
    System.Diagnostics.Debug.WriteLine("UPDATING DATABASE");

}

完整 View (这是PartialView):

<script>
   function SubmitClick () {
        var pid = $(this).data('personid');
        var sid = $(this).data('surveyid');
        var url = '@Url.Action("SubmitSurvey", "Person")';
        $.post(url, { personid: pid, surveyid: sid }, function (data) {
            alert('updated');
        });
    };
</script>

@using WebApplication2.Models
@model   System.Tuple<Person, List<Survey>>

<hr />
<h1>Surveys</h1>
<input type="button" id="Coll" value="Collapse" onclick="javascript:CollapseDiv()" />
@*<p>
        Number of Surveys: @Html.DisplayFor(x => Model.Item2.Count)
    </p>*@

@{int i = 1;}
@foreach (var survey in Model.Item2) {
    using (Html.BeginForm()) {
        <h2>Survey @(i)</h2>
        <p />
        @Html.EditorFor(x => survey.Questions)
        <button class='mybutton' type='button' data-personid="@Model.Item1.Id" data-surveyid="@survey.Id" onclick="javascript:SubmitClick()">Click Me</button>
    }
    i++;
    <hr style="background-color:rgb(126, 126, 126);height: 5px" />
}
<hr />

问题是,当我单击按钮时: enter image description here

我收到运行时错误,指出没有定义:“SubmitClick”

enter image description here

最佳答案

我在您的代码中没有看到任何明显的问题,但考虑到您正在以次优方式处理此问题,重构代码可能只需通过改进设置即可解决问题。

首先,不要将脚本直接嵌入 View 中。我知道您需要包含通过 Razor 助手之一生成的 URL,但我在这里讨论的是使用部分,以便您的脚本包含在文档中的标准位置中:

所以,在你看来:

@section Scripts
{
    <script>
        // your code here
    </script>
}

然后在您的布局中:

    <!-- global scripts like jQuery here --> 
    @RenderSection("Scripts", required: false)
</body>

这确保了 1) 所有 JavaScript 都在其应该运行的位置,就在结束 body 标记之前,2) 所有 JavaScript 在它可能依赖的各种全局脚本之后运行(jQuery )。

其次,在全局范围内定义事物通常是一个坏主意,例如您使用 SubmitClick 函数所做的事情。如果另一个脚本出现并在全局范围内定义了它自己的 SubmitClick 函数,那么您的脚本就会被淹没,反之亦然。相反,您想使用命名空间或闭包。

命名空间

var MyNamespace = MyNamespace || {};

MyNamespace.SubmitClick = function () {
    ...
}

关闭

(function () {
    // your code here
})();

当然,如果您使用这样的闭包,那么您的 SubmitClick 函数确实将不存在,因为它不再位于全局范围内,这让我想到...

第三,不要使用 on* HTML 属性。最好将功能动态绑定(bind)到元素,例如:

(function () {
    $('.mybutton').on('click', function () {
        var pid = $(this).data('personid');
        var sid = $(this).data('surveyid');
        var url = '@Url.Action("SubmitSurvey", "Person")';
        $.post(url, { personid: pid, surveyid: sid }, function (data) {
            alert('updated');
        });
    });
})();

现在,您已经实现了零范围污染,并且行为被定义在行为定义的地方,而不是紧密耦合 HTML 和 JavaScript。

关于javascript - 尚未找到函数 SubmitSurvey 的定义,但我定义了它,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25574070/

相关文章:

javascript - 为什么 regex 或 .replace() 不使用 CKEditor 和 Javascript 替换脚本中的字符串?

javascript - Node.js 集群没有改进。一些博客声称的每秒交易数

javascript - 如何获取 jQuery UI 选项卡元素面板并设置其中一些的可见性?

c# - Protected Internal 和 Internal Protected 之间有区别吗?

c# - Linq to entities 无法识别我的实体类型

javascript - 通过 Promise.all 回调几个 API Endpoint 来调度 Redux Action

javascript - 为什么 qtip2 插件不能使用 HTML?

jquery - 使用 jquery 启用表格中带有 rowspan 的文本框

javascript - 如何使用谷歌地图 API 制作一个在特定半径范围内搜索项目的表单?

c# - WhenActivated 在 ViewModelViewHost 控件中托管的 Views 和 ViewModel 中使用时被调用两次