.net核心没有路由到POST方法

时间:2017-07-14 19:20:02

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

此处链接到项目 - > https://github.com/crumdev/hqbbq.git

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

[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方法中提交带有断点的表单时,它永远不会中断,而是使用常规方法,然后再次返回视图。我已经尝试将我的表单简化为name字段,只捕获它并且它不会进入POST方法。我给了常规的Contact方法[HttpGet]属性,所以它只能严格用于GET请求,当我提交表单时,它会完全绕过我的控制器,并返回除了" Hello之外的空白的异常页面世界&#34!;屏幕上。我已经阅读了文档,并在teamtreehouse.com上阅读了常规ASP.Net的教程,但无法理解为什么它会以这种方式运行。

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

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

4 个答案:

答案 0 :(得分:6)

如果打算使用属性路由,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与目标操作的参数匹配

答案 1 :(得分:2)

您似乎错过了Route方法的[HttpPost]属性。 试试这个。

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

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

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

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

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

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

答案 2 :(得分:1)

您可以在控制器发布方法中为参数使用FromForm批注

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

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

答案 3 :(得分: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(  )

如果现在您开始行动,那么您在模型中就有问题,否则-您在布线方面有问题