此处链接到项目 - > 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
答案 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( )
如果现在您开始行动,那么您在模型中就有问题,否则-您在布线方面有问题