我最近开始在我的.net核心网络应用中使用区域来组织项目中的数百个文件。这一切都运作良好,直到现在。
我在自己的区域有一个控制器,带有这些装饰器
namespace MyApp.Controllers
{
[Area("Doc")]
[Route("doc")]
public class DailyOperatingCtrlController : Controller
{
...
}
}
然后每个动作方法都这样装饰:
[Authorize]
[Route("[action]/{page:int?}")]
public async Task<IActionResult> DOC()
{
...
}
我以这篇文章为例:How to use an Area in ASP.NET Core
我的Startup.cs路线如下所示:
app.UseMvc(routes =>
{
routes.MapRoute("areaRoute", "{area:exists}/{controller=Admin}/{action=Index}/{id?}");
routes.MapRoute(
name: "default",
template: "{controller=Home}/{action=Index}/{id?}");
});
在同一个控制器中,我有几个方法都有[HttpPost]装饰器并按预期工作。
以下是我遇到的具体问题:
我有这个方法,加载一个带有表单的页面:
[Authorize]
[Route("[action]/{page:int?}")]
public async Task<IActionResult> DocService()
{
var model = new ForecastViewModel
{
{ ... }
};
return View(model);
}
然后这个方法用于POST:
[Authorize]
[HttpPost]
[ValidateAntiForgeryToken]
[Route("[action]/{page:int?}")]
public async Task<IActionResult> DocService(int ForecastRtnId, string checkgroup, [Bind("{...}")] ForecastRtn forecastRtn)
{
/* Save data to a table and redirect back to the GET method */
{ ... }
}
现在到目前为止一切顺利,这很好用。我遇到的问题是我在上面的页面中打开了一个子窗口。因此,在DocService.cshtml文件中,我有一个简短的js脚本,可以打开一个弹出窗口:
function PopupService() {
url = "@Url.Action("DocServiceComment", "DailyOperatingCtrl", new { Area = "Doc", Id = "ID" })".replace("ID",parseInt(@lab_id));
title = "Some Title";
w = 600;
h = 400;
{ ... }
}
我正在使用Url.Action,我也传递了Area name和Id参数。弹出窗口是一个单独的输入框表单,用于将用户注释保存到单独的审计表中。没什么好看的。
[Authorize]
[Route("[action]/{page:int?}")]
public async Task<IActionResult> DocServiceComment(int? Id)
{
if (Id == null)
{
return NotFound();
}
var forecast = await _context.Forecast.SingleOrDefaultAsync(m => m.ForecastId == Id);
if (forecast == null)
{
return NotFound();
}
return View(forecast);
}
到目前为止一切顺利,弹出窗口正确加载并在输入框中有正确的注释(如果还有一个已经存在)
我注意到了 - 我相信这就是问题所在 - 弹出窗口的URL如下所示:
http://localhost:5000/doc/DocServiceComment?Id=2
而不是:
http://localhost:5000/doc/DocServiceComment/2
但我可能在这里错了,令人困惑的事情。 当我尝试提交此弹出窗口时,我收到404错误。
我的DocServiceComment发布方法:
[Authorize]
[HttpPost]
[ValidateAntiForgeryToken]
[Route("[action]/{page:int?}")]
public async Task<IActionResult> DocServiceComment(int id, [Bind("{ ...}")] Forecast forecast)
{
/* Save stuff and redirect back to get */
}
显然根本没有被召唤。
在我的DocServiceComment.cshtml中,我试过这个:
<form asp-area="Doc" asp-controller="DailyOperatingCtrl" asp-action="DocServiceComment">
/* Form stuff goes here */
</form>
我试图找到关于此的任何信息但无济于事,这让我觉得我在某个地方犯了一个菜鸟错误?
另外一个提示,如果我们采用此URL
http://localhost:5000/doc/DocServiceComment?Id=2
并删除?Id = 2也会出现404错误。
这是唯一一个表现得像这样的页面,我需要帮助弄清楚发生了什么。