繁体   English   中英

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

[英].net core not routing to POST method

链接到项目 - > 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 World!”之外的空白的异常页面。 屏幕上。 我已经阅读了文档,并在teamtreehouse.com上阅读了常规ASP.Net的教程,但是无法理解为什么它会以这种方式运行。

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

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

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

看起来你在[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"

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

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

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

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

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 - 应该是boolean,但我传递了字符串。 首先,我要做的是删除Post方法中的参数。

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM