【问题标题】:.net core not routing to POST method.net 核心未路由到 POST 方法
【发布时间】:2017-07-14 19:20:02
【问题描述】:

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

我有一个带有 1 个控制器的简单 3 页 MVC 网站。对于联系页面,我有一个小的 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 请求,当我提交表单时,它会完全绕过我的控制器并返回除“Hello World!”之外为空白的 Dev 异常页面。屏幕上。我已经通读了文档并遵循了 teamtreehouse.com 上针对常规 ASP.Net 的教程,但不明白为什么它会这样。

编辑: 这是提交 POST 的页面的代码。我只是使用带有 POST 方法的纯 HTML 表单来提交数据。

https://github.com/crumdev/hqbbq/blob/master/HQ-BBQ/Views/Home/contact.cshtml

【问题讨论】:

  • 如果没有呈现此行为的客户端代码,我们将无法为您提供帮助。 (即发布您的 javascript/ajax/html 表单)
  • 你没有给你的 post 方法提供任何路线?

标签: c# http-post asp.net-core-mvc asp.net-mvc-routing


【解决方案1】:

如果打算使用属性路由,则 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,我是否还需要明确地在方法上方设置路由?
【解决方案2】:

您似乎缺少 [HttpPost] 方法上的 Route 属性。 试试这个。

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

同时更新您的视图代码,使您的<input /> 标记的name 属性与您的控制器操作的参数相匹配。

请记住,MVC 使用 name 属性绑定到控制器操作中的参数。 MSDN Model Binding

例如更新您的电子邮件输入以包含名称属性:

<input name="email" id="email" class="input" type="text" placeholder="Email" value="@ViewBag.Email">

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

【讨论】:

  • 谢谢。但现在 respose 从 404 返回到 : (415) Unsupported Media Type. 总比没有好。但仍然没有到达控制器
【解决方案3】:

您可以在控制器 post 方法中为您的参数使用 FromForm 注解

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

我还建议使用视图模型,而不是将表单的所有字段作为参数传递。假设你有一个包含 10 个字段的表单,你的方法签名会更难阅读

【讨论】:

    【解决方案4】:

    例如,我传递的对象与模型不匹配,因此我无法执行操作

    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(  )
    

    如果你现在开始行动,那么你的模型就有问题,否则 - 你的路由有问题

    【讨论】:

      猜你喜欢
      • 2018-08-09
      • 2020-11-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-05-30
      • 2023-03-07
      相关资源
      最近更新 更多