.net 核心不路由到 POST 方法
.net core not routing to POST method
Link 投影到这里 -> 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 方法中使用断点提交表单时,它永远不会中断,而是使用常规方法并再次 returns 视图。我已经尝试将我的表单减少到只有名称字段并且只捕获它并且它没有进入 POST 方法。我已经为常规联系方法提供了 [HttpGet] 属性,因此它只能严格用于 GET 请求,当我提交表单时,它会完全绕过我的控制器和 returns Dev 异常页面,除了 "Hello World!" 在屏幕上。我已经通读了文档并遵循了关于 teamtreehouse.com 的常规 ASP.Net 教程,但无法理解为什么会这样。
编辑:
这是提交 POST 的页面的代码。我只是使用带有 POST 方法的普通 HTML 表单来提交数据。
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 使用名称 属性 绑定到控制器操作中的参数。 MSDN Model Binding
例如更新您的电子邮件输入以包含姓名 属性:
<input name="email" id="email" class="input" type="text" placeholder="Email" value="@ViewBag.Email">
您还需要将文本区域名称更新为 name="message"
。
您可以在控制器 post 方法中为您的参数使用 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 - 应该是布尔值,但我传递了字符串。
因此,首先要做的是删除 Post 方法中的参数。
[HttpPost] public async Task<IActionResult> PostNews( )
如果你现在开始行动,那么你的模型有问题,否则 - 你的路由有问题
Link 投影到这里 -> 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 方法中使用断点提交表单时,它永远不会中断,而是使用常规方法并再次 returns 视图。我已经尝试将我的表单减少到只有名称字段并且只捕获它并且它没有进入 POST 方法。我已经为常规联系方法提供了 [HttpGet] 属性,因此它只能严格用于 GET 请求,当我提交表单时,它会完全绕过我的控制器和 returns Dev 异常页面,除了 "Hello World!" 在屏幕上。我已经通读了文档并遵循了关于 teamtreehouse.com 的常规 ASP.Net 教程,但无法理解为什么会这样。
编辑: 这是提交 POST 的页面的代码。我只是使用带有 POST 方法的普通 HTML 表单来提交数据。
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 使用名称 属性 绑定到控制器操作中的参数。 MSDN Model Binding
例如更新您的电子邮件输入以包含姓名 属性:
<input name="email" id="email" class="input" type="text" placeholder="Email" value="@ViewBag.Email">
您还需要将文本区域名称更新为 name="message"
。
您可以在控制器 post 方法中为您的参数使用 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 - 应该是布尔值,但我传递了字符串。 因此,首先要做的是删除 Post 方法中的参数。
[HttpPost] public async Task<IActionResult> PostNews( )
如果你现在开始行动,那么你的模型有问题,否则 - 你的路由有问题