【问题标题】:Razor Pages with JQuery & DRY principle使用 JQuery 和 DRY 原理的 Razor 页面
【发布时间】:2021-12-31 14:52:35
【问题描述】:

我正在使用 ASP.NET Core、Entity Framework Core 和 Razor Pages 编写一个 Web 应用程序。 我有许多使用 jQuery 与页面控制器对话的页面:一个选择的下拉值可能会改变另一个下拉列表,如下所示:

$(function () {
    $("#Position_PositionState").on("change", function () {
        var projectId = $("#Position_ProjectId").val();
        $.getJSON(`?handler=Project&projectId=${projectId}`, function (response) {
            if (response === "Inactive") {
                var state = document.getElementById('Position_PositionState');
                for (var i = 0; i < state.options.length; i++) {
                    if (state.options[i].text === response) {
                        state.selectedIndex = i;
                        break;
                    }
                }
            }
        });
    });
});

页面上提供 JSON 响应的代码如下所示:

public async Task<JsonResult> OnGetProjectAsync(string projectId)
{
    if (!string.IsNullOrWhiteSpace(projectId))
    {
        if (Int32.TryParse(projectId, out int id))
        {
            var project = await _context.Projects.FindAsync(id);
            if (project != null)
            {
                if (project.ProjectState == ProjectState.Active)
                    return new JsonResult("Active");
                else
                    return new JsonResult("Inactive");
            }
            else return new JsonResult("Inactive");
        }
        else
        {
            return new JsonResult("Inactive");
        }
    }
    return new JsonResult("Inactive");
}

问题是:

  • 如何将在许多页面上重复的代码(控制器代码)移动到单独的实用程序 类并将 ApplicationContext 传递给它。
  • 如何以及在何处实例化该实用程序类。
  • 如何从 jQuery 调用该实用程序类。

我只能在 .cshtml.cs 页面上使用此代码,该页面具有带有 jQ​​uery 的 .cshtml 视图,而不能在其他地方使用。
提前感谢您的帮助。

【问题讨论】:

  • 我不确定。你说“一个选择的下拉值可能会改变另一个下拉”。但是 Javascript 代码只显示一个下拉列表(显然)#Position_PositionState,它可能会改变自己,而不是另一个下拉列表。也许如果您也向我们展示 Razor,它会更清楚吗?另外,您需要以何种方式调用相同的代码。如果是相同的代码,为什么不从不同的页面调用相同的Action?如果不是完全相同的代码,有什么变化需要参数化?
  • 嗨@VollerSterne,你不能从jquery调用实用程序类,你应该做的是在你的PageModel/Controller代码中调用实用程序类。然后使用 ajax 调用 PageModel/Controller。
  • 如果你有一个在多个控制器上使用的动作,那么创建一个“基本控制器”并从中继承你的多个控制器。将您的操作放在基本控制器中,它将在从基本控制器继承的控制器的所有剃须刀页面上可用。
  • @Laurent Gabiot 如果项目处于非活动状态,特定的 ajax 会阻止下拉菜单更改为活动。
  • @Rena 谢谢,我会试试的。

标签: c# jquery asp.net-core entity-framework-core


【解决方案1】:

不是答案,但您的Action 代码可以简化,returns 和 ifs 太多了。

一个例子:

public async Task<JsonResult> OnGetProjectAsync(string projectId)
{
    if (!int.TryParse(projectId, out int id))
    {
        return new JsonResult("Inactive");
    }
    var project = await _context.Projects.FindAsync(id);
    var result = project?.ProjectState == ProjectState.Active 
        ? "Active"
        : "Inactive";
    return new JsonResult(result);
}

不需要检查string.IsNullOrWhitespace,因为int.TryParse 将返回falseProjectId 字符串为空或空格。

也无需显式检查project 是否为null,因为wa 可以使用? 运算符传播null,而null == ProjectState.Active 将始终为false。

【讨论】:

  • 不是答案 - 这不是codereview.stackexchange.com - 非答案应该在 cmets 中(尽管显然有点太多无法评论)或作为额外的真正的答案。
猜你喜欢
  • 2022-10-23
  • 2022-08-24
  • 2019-08-04
  • 1970-01-01
  • 2018-01-26
  • 1970-01-01
  • 2014-12-02
  • 2019-04-04
  • 2019-08-02
相关资源
最近更新 更多