为什么我的标记助手不能在MVC中工作?

时间:2018-04-18 13:23:25

标签: c# asp.net-mvc

我有一个包含3个输入的表单,使用标记帮助程序和具有这3个属性的数据传输对象。

当我将对象添加到我的数据库时,值为空。我将属性设置为[必需],即使这不会给我一个错误。

我在cshtml文件中声明了这个模型: @model CRM_Collect.Dtos.ClientDto

形式:

<form asp-controller="Client" asp-action="AddClient" method="post">
<div class="form-group">
    <label for="companyName">Company</label>
    <input asp-for="Company" class="form-control" id="companyName" placeholder="Company name">
</div>
<div class="form-group">
    <label for="comment">Comment</label>
    <textarea asp-for="Comment" class="form-control" id="comment" rows="3"></textarea>
</div>
<div class="form-group">
    <label for="companyWebsite">Website</label>
    <input asp-for="Website" class="form-control" id="companyWebsite" placeholder="www.example.com">
</div>
<button type="submit" class="btn btn-primary">Submit</button>

数据传输类

[Required]
    public String Company { get; set; }
    [Required]
    public String Website { get; set; }
    [Required]
    public String Comment { get; set; }

发布控制器

    [HttpPost]
    public ActionResult AddClient(ClientDto client)
    {
        ClientContext clientContext = new ClientContext();

        Client clientToAdd = new Client { Comment = client.Comment, Company = client.Company, Website = client.Website };

        clientContext.Clients.Add(clientToAdd);
        clientContext.SaveChanges();

        return View();
    }

3 个答案:

答案 0 :(得分:0)

在动作的参数上明确使用FromBody属性。还要考虑检查模型状态,因为模型使用[Required]验证属性。

[HttpPost]
public ActionResult AddClient([FromBody]ClientDto client) {
    if(ModelState.IsValid) {
        using(var clientContext = new ClientContext()) {
            var clientToAdd = new Client { 
                Comment = client.Comment, 
                Company = client.Company, 
                Website = client.Website
            };
            clientContext.Clients.Add(clientToAdd);
            clientContext.SaveChanges();
        }
    }
    return View();
}

答案 1 :(得分:0)

原来我使用的是不支持帮助器标签的版本。我没有使用ASP.NET Core这个问题。

答案 2 :(得分:0)

当人们尝试将表单发布到控制器时,这是我见过的最常见的错误。您需要在表单的所有输入上设置name属性,以便控制器处理输入字段内的数据,并将其与作为操作参数的模型属性相对应。

您的表单应如下所示:

   <form asp-controller="Client" asp-action="AddClient" method="post">
    <div class="form-group">
        <label for="companyName">Company</label>
        <input asp-for="Company" name="company" class="form-control" id="companyName" placeholder="Company name">
    </div>
    <div class="form-group">
        <label for="comment">Comment</label>
        <textarea asp-for="Comment" name="comment" class="form-control" id="comment" rows="3"></textarea>
    </div>
    <div class="form-group">
        <label for="companyWebsite">Website</label>
        <input asp-for="Website" name="website" class="form-control" id="companyWebsite" placeholder="www.example.com">
    </div>
    <button type="submit" class="btn btn-primary">Submit</button>
  </form>