区域中的路由错误,.net核心1.1仅在POST上

时间:2018-04-10 11:16:02

标签: c# .net asp.net-core .net-core url-routing

我最近开始在我的.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错误。

这是唯一一个表现得像这样的页面,我需要帮助弄清楚发生了什么。

0 个答案:

没有答案