【问题标题】:Executing c# code in jQuery [duplicate]在jQuery中执行c#代码[重复]
【发布时间】:2018-10-25 13:28:58
【问题描述】:

我有返回日期列表的模型函数。在我看来,我不想将类似的代码复制到 jQuery 中来填充下拉列表。

jQuery 可以执行它在 C# 中的模型函数并存储日期列表吗?

public List<string> GetAvailableDateInStrings()
{
    List<string> dateList = new List<string>();
    foreach(Year year in this.m_years)
    {
        foreach(Month month in year.GetMonths())
        {
            string monthString = month.MonthInEnum.ToString() + " " + year.CalendarYear.ToString();
            if(year.CalendarYear == this.m_cutOffYear && month.MonthInYear <= this.m_cutOffMonth)
            {
                dateList.Add(monthString);
            }
            else if(year.CalendarYear < this.m_cutOffYear)
            {
                dateList.Add(monthString);
            }
        }
    }
    return dateList;
}

以下是我现在所做的。但我想通过不在 jQuery 中创建类似的代码来减少代码重复。因此 jQuery 需要执行 C# 函数并将日期列表存储在变量中,然后填充到下拉列表中。

<script src="/Bootstrap_Sufee/assets/js/vendor/jquery-2.1.4.min.js"></script>
<script type="text/javascript">$(document).ready(function() {
    $("#attendanceReportType").change(function() {
        if ($("#attendanceReportType").val() == "Class Monthly") {
            $("#attendanceReportYear").empty();
            $("#attendanceReportYear").append("<option>May 2018</option>");
            $("#attendanceReportYear").append("<option>April 2018</option>");
            $("#attendanceReportYear").append("<option>March 2018</option>");
    });
});</script>

【问题讨论】:

  • 如何做一个返回 GetAvailableDateInStrings 函数的 JsonResult 的操作。然后让您的 jQuery 调用该操作并遍历它返回的 Json 集合以填充您的选择。
  • “jQuery 能否执行它在 C# 中的模型函数”...如果您通过操作方法公开它,那么可以。这种东西就是 AJAX 的用途。

标签: c# jquery asp.net-mvc


【解决方案1】:

解决此问题的最佳方法是使用 ajax。在这种情况下,您的 c# 函数如下所示。

 public JsonResult GetAvailableDateInStrings()
    {
        List<string> dateList = new List<string>();
        foreach (Year year in this.m_years)
        {
            foreach (Month month in year.GetMonths())
            {
                string monthString = month.MonthInEnum.ToString() + " " + year.CalendarYear.ToString();
                if (year.CalendarYear == this.m_cutOffYear && month.MonthInYear <= this.m_cutOffMonth)
                {
                    dateList.Add(monthString);
                }
                else if (year.CalendarYear < this.m_cutOffYear)
                {
                    dateList.Add(monthString);
                }
            }
        }
        return Json(dateList);
    }

jQuery 代码将如下所示。

<script src="/Bootstrap_Sufee/assets/js/vendor/jquery-2.1.4.min.js"></script>

<script type="text/javascript">

        $(document).ready(function () {
        $("#attendanceReportType").change(function () {
            if ($("#attendanceReportType").val() === "Class Monthly") {
                $("#attendanceReportYear").empty();
                $.ajax({
                    type: 'POST',
                    url: '/YourController/GetAvailableDateInStrings',
                    success: function (response) {
                        var dateList = response.result;
                        $.each(dateList,
                            function (index, obj) {
                                $("#attendanceReportYear").append("<option>" + obj + "</option>");
                            });
                    }
                });
            }
        });
        });

</script>

【讨论】:

  • c#函数必须是控制器动作?我实际上是网络开发的新手,非常感谢您的回答。 :)
  • @KWCham。是的,应该是。如果您在任何其他类中有此方法,则应在控制器中创建任何其他方法,这些方法将通过 Ajax 调用。
【解决方案2】:

正如另一个答案告诉你的那样,Ajax 是可能的。但是有一个更简单的解决方案:在您的视图中生成所需的代码,使用 ViewBag

在您的控制器操作中

ViewBag.MyDateList = myListOfDates;

在你看来

$("#attendanceReportType").change(function() {
    if ($("#attendanceReportType").val() == "Class Monthly") {
        $("#attendanceReportYear").empty();

        @foreach (var myDate in ViewBag.MyDateList)
        {
            $("#attendanceReportYear").append("<option>@myDate.ToString("MMMM yyyy")</option>");
        }
    }
});

这将生成所需的 jQuery 代码,而无需您自己复制/粘贴。

【讨论】:

  • 哦,c#代码可以直接用jQuery执行吗?我是网络开发的新手,非常感谢您的回答。 :)
  • @KWCham:不直接在 jQuery 中。相反,视图是使用 Razor 构建的,它会为您生成网页。生成的页面被发送到浏览器,浏览器在页面上执行 Javascript/jQuery(可能包括您在 Razor 中生成的特定脚本)。您可以使用 @foreach 之类的东西来影响 Razor 生成过程,这意味着您可以迭代地生成部分网页内容。这可以是 HTML、javascript、jQuery,... 这并不重要。将 Razor 视为高级网页 HTML String.Format 变体,因为它本质上就是这样做的。
  • @KWCham:明确一点:控制器执行操作。然后控制器告诉 Razor 渲染一个视图。 Razor 呈现该视图,这实际上只是创建了网页的 HTML(一个字符串)。 MVC 将该字符串发送到发送 Web 请求的浏览器。然后浏览器相应地呈现页面,并在页面上执行任何 JavaScript。 Razor 在 web 服务上运行; jQuery 在客户端浏览器中运行。从字面意义上说,一个不会在另一个中运行。它们甚至不在同一台机器上运行(服务器与用户的计算机)
  • 在这种情况下,如果我理解正确的话,上面的jQuery代码在客户端执行,当它到达c#代码时,它会再次请求服务器执行c#代码,然后服务器发送结果回到 jQuery 发送请求的地方?
  • @KWCham 每个新请求都会创建一个新网页,该网页自行运行。所以是的,jQuery 可以引发一个 Web 请求,该请求返回一个新页面,在该页面上执行 jQuery,但它不会是与以前相同的页面。有更复杂的方法可以解决这个问题,但这超出了这里的问题范围。我建议查看 MVC 教程,因为这是 MVC 运行方式的核心
猜你喜欢
  • 1970-01-01
  • 2013-12-07
  • 2017-09-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-16
  • 1970-01-01
相关资源
最近更新 更多