【问题标题】:MVC ASP.NET Core 3.1 POST to Create method does not populate modelMVC ASP.NET Core 3.1 POST to Create 方法不填充模型
【发布时间】:2020-04-29 19:37:02
【问题描述】:

我已经使用 Visual Studio 2019 创建了一个创建视图(右键单击 > 添加 > 视图)并在这样做时设置了正确的模型。创建 Create 视图后,我将代码添加到 Create HttpPost ActionMethod 并尝试运行该应用程序。 ActionMethod 被命中,但是应该传入该方法的数据模型没有被填充;尽管在浏览器中输入了数据,但一切都是空的。奇怪的是,我在应用程序中的其他页面以完全相同的方式创建(甚至其他区域上的其他创建)也可以正常工作。我错过了什么?

型号:

   public class BondsAllProjectsModel
{
    [Key]
    public int ProjectID { get; set; }

    [Display(Name = "Project Name")]
    [Required (ErrorMessage = "Project Name is required.")]
    [StringLength(50)]
    public string ProjectName { get; set; }

    [Display(Name = "Project Name Alias")]
    [StringLength(50)]
    public string ProjectNameAlias { get; set; }

    [StringLength(50)]
    public string Municipality { get; set; }

    [StringLength(4)]
    public string ProjectCode { get; set; }

    public bool IsProject { get; set; }

    [RegularExpression(@"^[0-9]*\.?[0-9]*", ErrorMessage = "Only numbers are allowed.")]
    public double? ProjectAcres { get; set; }

    [RegularExpression(@"\d+", ErrorMessage = "Only numbers are allowed.")]
    public double? ProjectUnits { get; set; }

    public int? MunicipalityID { get; set; }

    [DataType(DataType.Date, ErrorMessage = "Project Completed must be a valid date.")]
    [DisplayFormat(DataFormatString = "{0:MM/dd/yyyy}")]
    public DateTime? ProjectCompleted { get; set; }

    [MaxLength(100)]
    public string CurrentNotes { get; set; }

    public int? ProjectTypeID { get; set; }
    public bool Discontinued { get; set; }
}

查看:

@model BOnlineMVC.Models.BondsAllProjectsModel

@{
    ViewData["Title"] = "Create";
}

<h1>Create</h1>

<h4>BondsAllProjectsModel</h4>
<hr />
<div class="row">
    <div class="col-md-4">
        <form asp-action="Create" method="post">
            <div asp-validation-summary="ModelOnly" class="text-danger"></div>
            <div class="form-group">
                <label asp-for="ProjectID" class="control-label"></label>
                <input asp-for="ProjectID" class="form-control" />
                <span asp-validation-for="ProjectID" class="text-danger"></span>
            </div>
            <div class="form-group">
                <label asp-for="ProjectName" class="control-label"></label>
                <input asp-for="ProjectName" class="form-control" />
                <span asp-validation-for="ProjectName" class="text-danger"></span>
            </div>
            <div class="form-group">
                <label asp-for="ProjectNameAlias" class="control-label"></label>
                <input asp-for="ProjectNameAlias" class="form-control" />
                <span asp-validation-for="ProjectNameAlias" class="text-danger"></span>
            </div>
            <div class="form-group">
                <label asp-for="Municipality" class="control-label"></label>
                <input asp-for="Municipality" class="form-control" />
                <span asp-validation-for="Municipality" class="text-danger"></span>
            </div>
            <div class="form-group">
                <label asp-for="ProjectCode" class="control-label"></label>
                <input asp-for="ProjectCode" class="form-control" />
                <span asp-validation-for="ProjectCode" class="text-danger"></span>
            </div>
            <div class="form-group form-check">
                <label class="form-check-label">
                    <input class="form-check-input" asp-for="IsProject" /> @Html.DisplayNameFor(model => model.IsProject)
                </label>
            </div>
            <div class="form-group">
                <label asp-for="ProjectAcres" class="control-label"></label>
                <input asp-for="ProjectAcres" class="form-control" />
                <span asp-validation-for="ProjectAcres" class="text-danger"></span>
            </div>
            <div class="form-group">
                <label asp-for="ProjectUnits" class="control-label"></label>
                <input asp-for="ProjectUnits" class="form-control" />
                <span asp-validation-for="ProjectUnits" class="text-danger"></span>
            </div>
            <div class="form-group">
                <label asp-for="MunicipalityID" class="control-label"></label>
                <input asp-for="MunicipalityID" class="form-control" />
                <span asp-validation-for="MunicipalityID" class="text-danger"></span>
            </div>
            <div class="form-group">
                <label asp-for="ProjectCompleted" class="control-label"></label>
                <input asp-for="ProjectCompleted" class="form-control" />
                <span asp-validation-for="ProjectCompleted" class="text-danger"></span>
            </div>
            <div class="form-group">
                <label asp-for="CurrentNotes" class="control-label"></label>
                <input asp-for="CurrentNotes" class="form-control" />
                <span asp-validation-for="CurrentNotes" class="text-danger"></span>
            </div>
            <div class="form-group">
                <label asp-for="ProjectTypeID" class="control-label"></label>
                <input asp-for="ProjectTypeID" class="form-control" />
                <span asp-validation-for="ProjectTypeID" class="text-danger"></span>
            </div>
            <div class="form-group form-check">
                <label class="form-check-label">
                    <input class="form-check-input" asp-for="Discontinued" /> @Html.DisplayNameFor(model => model.Discontinued)
                </label>
            </div>
            <div class="form-group">
                <input type="submit" value="Create" class="btn btn-primary" />
            </div>
        </form>
    </div>
</div>

<div>
    <a asp-action="Index">Back to List</a>
</div>

控制器:

[HttpPost]
public ActionResult Create(BondsAllProjectsModel projectData)
    {
        try
        {
            if (ModelState.IsValid)
            {
                int newProjectID = bDAL.AddProject(projectData);

                return Redirect("~/Bonds/ProjectMaintenance/Create2/" + newProjectID);
            }
            else
            {
                return View();
            }
        }
        catch
        {
            return View();
        }
    }

【问题讨论】:

    标签: asp.net-core model-view-controller


    【解决方案1】:

    您可以尝试明确指定模型绑定器在绑定数据时应查看的位置,方法是使用 [FromForm]属性

    click here for more info

    【讨论】:

    • 您最接近实际问题所在。你的提示把我送回了谷歌,这让我找到了这个链接:[jonhilton.net/2017/08/17/…。从这篇文章中,我发现如果我将 name 属性添加到 中,模型就会被填充。我不知道为什么“asp-for”不能单独工作。似乎应该这样做。
    【解决方案2】:

    视图顶部添加@model namespace.BondsAllProjectsModel

     <div class="form-group">
                <label asp-for="ProjectID" class="control-label"></label>
                <input asp-for="@Model.ProjectID" class="form-control" />
                <span asp-validation-for="ProjectID" class="text-danger"></span>
            </div>
    

    【讨论】:

    • 这一行已经存在(只是没有进入上面的 SO 代码块)。数据仍然没有填充模型。此外,将 asp-for=@Model.ProjectID 添加到 会导致错误:对象引用未设置为对象的实例。
    【解决方案3】:

    只需在创建视图的顶部添加这一行:

    @model YourNamespace.BondsAllProjectsModel

    其他都不需要修改。

    【讨论】:

    • 这一行已经存在(只是没有进入上面的 SO 代码块)。数据仍然没有填充模型。
    猜你喜欢
    • 2022-09-26
    • 2020-10-19
    • 2021-02-06
    • 2020-12-03
    • 1970-01-01
    • 2021-02-20
    • 1970-01-01
    • 2021-12-06
    • 2020-07-06
    相关资源
    最近更新 更多