.NET Core不能路由到POST方法

8

在这里链接到项目 -> https://github.com/crumdev/hqbbq.git

我有一个简单的3页MVC网站,只有1个控制器。对于联系页面,我有一个小的3输入表格。以下是控制器方法:

[Route("contact/")]
public IActionResult Contact()
{
    return View();
}

[HttpPost]
public IActionResult Contact(string name, string email, string message)
{
    ViewBag.Name = name;
    ViewBag.Email = email;
    ViewBag.Message = message;

    return View();
}

当我在HttpPost的Contact方法中设置断点并提交表单时,它从未触发断点,而是使用常规方法,并仅返回视图。我已经尝试将表单简化为只包含名称字段,并只捕获该字段,但它并没有进入POST方法。我给普通的Contact方法添加了[HttpGet]属性,以便它仅用于GET请求,但当我提交表单时,它完全绕过我的控制器,并返回一个空白的Dev异常页面,屏幕上只有“Hello World!”。我已经阅读了文档并遵循了teamtreehouse.com的ASP.Net常规教程,但无法理解为什么它会出现这种情况。
编辑: 这是提交POST的页面代码。我只是使用一个普通的HTML表单和POST方法来提交数据。 https://github.com/crumdev/hqbbq/blob/master/HQ-BBQ/Views/Home/contact.cshtml

没有呈现此行为的客户端代码,我们无法帮助您。(例如发布您的JavaScript / Ajax / HTML表单) - Camilo Terevinto
你的 post 方法没有指定路由? - Laurent Lequenne
4个回答

9
如果意图使用属性路由,则POST操作也需要有一个路由。
[HttpGet]
[Route("contact")]
public IActionResult Contact() {
    return View();
}

[HttpPost]
[Route("contact")]    
public IActionResult Contact(string name, string email, string message) {
    ViewBag.Name = name;
    ViewBag.Email = email;
    ViewBag.Message = message;

    return View();
}

请注意不需要斜杠。确保表单输入的名称和ID与目标操作的参数匹配。

谢谢!问题已经解决了。如果我有一个单独的ContactController,我是否仍需要显式地在方法上方添加路由? - crumdev

2

看起来你在[HttpPost]方法上缺少Route属性。 试试这个。

[HttpPost]
[Route("contact/")]
public IActionResult Contact(string name, string email, string message)

同时更新您的视图代码,以便 <input /> 标签的 name 属性与您控制器操作的参数相匹配。
请记住,MVC 使用 name 属性来绑定到控制器操作中的参数。 MSDN 模型绑定 例如,更新您的电子邮件输入框以包括 name 属性:
<input name="email" id="email" class="input" type="text" placeholder="Email" value="@ViewBag.Email">

您还需要将文本区域名称更新为name="message"

感谢。但现在从404返回的响应为 :(415)不支持的媒体类型。虽然比没有好,但仍无法到达控制器。 - bh_earth0

1
你可以在控制器的POST方法参数中使用FromForm注释。
[HttpPost]
[Route("contact")]
public IActionResult Contact([FromForm]string name, [FromForm]string email, [FromForm]string message)

我建议使用viewmodel而不是将表单的所有字段作为参数传递。想象一下,如果您有一个包含10个字段的表单,那么您的方法签名将更难以阅读。


0

我无法路由到操作,因为我传递的对象与模型不匹配,例如

public class NewsModel : IActive
{
    [Key, DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public long Id { get; set; }
    public string NewsName { get; set; }
    public string NewsText { get; set; }
    public bool Active { get; set; }}

{"id":0,"newsName":"123","newsText":"123","active":""}

active - 应该是布尔型,但我传了字符串。 所以第一件事就是在Post方法中删除参数。

[HttpPost]   public async Task<IActionResult> PostNews(  )

如果你现在开始行动,那么问题可能出在模型上,否则 - 问题可能出在路由上。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接