我正在用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
代码可以简化,因为return
和if
太多了。
一个例子:
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。