具有JQuery和DRY原则的Razor Pages



我正在用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调用该实用程序类

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

不是答案,但您的Action代码可以简化,因为returnif太多了。

一个例子:

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,因为如果ProjectId字符串为null或空白,int.TryParse将返回false

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

最新更新