【发布时间】: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 页面上使用此代码,该页面具有带有 jQuery 的 .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