【问题标题】:Passing data from html form > Model > Controller not working从html表单传递数据>模型>控制器不起作用
【发布时间】:2018-06-10 11:16:48
【问题描述】:

我对 ASP.NET Core 完全陌生(2 周后),我需要使用 ASP.net 重新学习 Web 开发才能工作,是的,我试图弄清楚这一切。所以请原谅可能是菜鸟的问题。

我在将数据从 HTML 表单传递到模型然后传递到控制器时遇到问题,我无法弄清楚。这是我的问题。

这是基本的 HTML:

<form method="post" action="/FormProcWithModels" role="form">
    <input asp-for="UserName" type="text" id="UserName" placeholder="Enter your Full Name" />
    <input type="submit" />
</form>

这是模型:

namespace project001.Models
{
    public class ContactPageModel
    {
        public string UserName{ get; set; }
    }
}

这里是控制器:

编辑以显示更多代码。这是我的 GET 方法

[HttpGet]
public IActionResult Contact()
{
   ViewBag.PageTitle = "This is the Contact page";
   return View();
}

[HttpPost("FormProcWithModels")]
public IActionResult Contact(ContactPageModel model)
{
    return Content($"The form username entered is {model.UserName}");
}

例如,当我在表单中输入“Jim”的名称并提交时,页面加载时显示“输入的表单用户名是:”,但名称没有通过。

我没有收到错误或任何错误,而且我还不够好,无法弄清楚为什么 数据为空。

提前感谢您提供的任何帮助。

编辑:

当我这样做时:

[HttpPost("FormProcWithoutModels")]
public IActionResult Contact(string uName)
{
    string currentUser = uName;
    ViewBag.PageTitle = "This is the Contact page";
    //return View();
    return Content($"The form username entered is {currentUser}");
}

它可以在没有模型的情况下工作。当我尝试使用模型时,它不起作用!

【问题讨论】:

  • 如果这只是一个基础的学习项目,可以考虑上传到 Github 上让别人看看。问题中没有足够的信息来解决此问题。
  • 由于输入的名称为name="UserName",因此无法使用名为string uName的参数,因此您没有显示相关代码。
  • 嗨@StephenMuecke,那是另一条路线。我用它来展示当我像这样进行数据传递时,它是如何工作的。注意 "FormProcwithoutModels" 与 "FormProcWithModel" 。对不起,如果我弄糊涂了
  • 您显示的代码工作正常。如果它不适合你,那么它是由于你没有向我们展示的其他代码。
  • 我很好奇,当您说您对 ASP.NET 核心完全陌生并且必须从头开始学习 Web 开发时,您之前使用的是什么?我对 ASP.NET Core 的学习曲线很感兴趣,它能让人们更轻松地使用 .NET Core...

标签: c# asp.net-core asp.net-core-mvc


【解决方案1】:

我认为这是因为您没有 get 方法。 您需要添加 get 方法来获取用户输入。

所以,基本上你的控制器看起来像:

[HttpGet]
public IActionResult Contact()
{
    return View();
}

[HttpPost("FormProcWithModels")]
public IActionResult Contact(ContactPageModel model)
{
    return Content($"The form username entered is {model.UserName}");
}

查看页面:

@model ContactPageModel

<form method="post" action="/FormProcWithModels">
    <input asp-for="UserName" type="text" id="UserName" placeholder="Enter your Full Name" />
    <input type="submit" />
</form>

虽然不行,加role="form"

<form method="post"...  role="form">

...
...
</form>

【讨论】:

  • 你好,我确实有一个“get 方法”,在我的代码中看起来和你的完全一样。
  • @somdow:谢谢你告诉我,我更新了答案,请检查
  • @somdow:我已经检查过了,你的代码确实有效..
  • 我更新了我的帖子以包括我的 GET 方法以及我添加角色 =“form”的 HTML。没事了。我没有看到任何错误,当我在返回内容行上放置一个断点并将鼠标悬停在“模型”上时,该值为空。另外,需要明确的是,这是在我的 html 表单剃须刀页面的顶部:@model project001.Models.ContactPageModel 什么都没有。
  • @somdow:不知道这是为什么它不起作用,它对我有用..请参阅此处:imgr.es/3SI4
【解决方案2】:

您也可以使用HttpContext.Request params 获取提交的值

[HttpPost("FormProcWithModels")]
public IActionResult Contact()
{
    var UserName = HttpContext.Request.Form["UserName"]

    return Content($"The form username entered is {UserName}");
}

使用FormCollection

[HttpPost("FormProcWithModels")]
public IActionResult Contact(FormCollection Fc)
{
    var UserName = Fc["UserName"].ToString();

    return Content($"The form username entered is {UserName}");
}

【讨论】:

  • 你好@programtreasures。我做了第一个,没有好处。对于第二个,我需要添加什么“使用”才能使其工作?
  • using Microsoft.AspNetCore.Http
【解决方案3】:

我发现在 ASP.Net Core 中,模型绑定并不总是那么自动。试试:

[HttpPost("FormProcWithModels")]
public IActionResult Contact([FromForm] ContactPageModel model)
{
    return Content($"The form username entered is {model.UserName}");
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-04-26
    • 1970-01-01
    • 1970-01-01
    • 2018-06-28
    • 1970-01-01
    • 2012-08-01
    相关资源
    最近更新 更多