繁体   English   中英

ASP.NET Core 2.0模型针对未在表单中使用的项目返回null

[英]ASP.NET Core 2.0 Model returns null for items not used in a form

上下文

ASP.NET Core 2.0 MVC项目

问题

使用视图模型是这样的:

public class UpdateReturnIssueViewModel
{
    public IssueTrackerIssue Issue { get; set; }

    public bool CloseIssue { get; set; }
}

其中IssueTrackerIssue是这样的:

public class IssueTrackerIssue
{
        [Required]
        [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
        public int ID { get; set; }

        [StringLength(19)]
        public string OrderNumber { get; set; }

        [Range(1, 50)]
        public int Quantity { get; set; }

        [StringLength(200)]
        public string ReturnCustomerComment { get; set; }
}

我这样获取View的数据:

    [HttpGet]
    public IActionResult UpdateReturnIssue(int ID)
    {
        // populate the view model in some way

        return View(this.updateReturnIssueViewModel);
    }

在我的视图中,我仅使用(即为其定义输入asp-for标记)IssueTrackerIssue.OrderNumber和CloseIssue。

这将被发布到控制器,因此:

[HttpPost]
[ValidateAntiForgeryToken]
public IActionResult UpdateReturnIssue(UpdateReturnIssueViewModel viewModel)
{
    if (this.ModelState.IsValid)
    {
        // Some other processing
    }
}

在控制器中检查viewModel时,我看到除了 View中使用的属性 ,所有内容均为null。

如何获取从控制器传递到View并完整返回到Controller的View模型的全部内容? 换句话说,如何在视图模型未使用该视图模型的某些部分的情况下完全往返于该视图模型?

原来有两个问题需要解决。

1)正如@JoshMein和其他人指出的那样,必须在表单上使用值,否则它们将以null的形式发布回控制器。 使用隐藏值可以克服此问题。

2)我的视图是主视图-细节类型视图,并且细节集合始终返回null,即为空集合。 我现在意识到这是由于我在View中编码了Detail集合的迭代的方式所致。 我在用

            @foreach (IssueTrackerIssueComment comment in Model.Issue.Comments)
            {
                <tr>
                    <td><input asp-for="@comment.ID" type="hidden" /></td>
                    <td><input asp-for="@comment.DateCreated" type="hidden" /></td>
                    <td><input asp-for="@comment.LastUpdated" type="hidden" /></td>
                    <td>
                        <input asp-for="@comment.DateCreated" class="form-control" type="date" asp-format="{0:yyyy-MM-dd}" />
                    </td>
                    <td>
                        <input asp-for="@comment.Narrative" class="form-control" />
                    </td>
                    <td>
                        <button asp-action="DeleteReturnIssueComment" asp-route-id=@comment.ID class="btn btn-primary">
                            <span class="glyphicon glyphicon-trash" />
                        </button>
                    </td>
                </tr>
            }

ASP.NET显然无法弄清楚这些@comment项是否已绑定到模型,因此它没有将它们传递回Controller。

因此,我将详细信息集合从ICollection <>更改为IList <>,并使用@for而不是@foreach,因此:

            @for (int i = 0; i < Model.Issue.Comments.Count; i++)
            {
                <tr>
                    <td><input asp-for="@Model.Issue.Comments[i].ID" type="hidden" /></td>
                    <td><input asp-for="@Model.Issue.Comments[i].DateCreated" type="hidden" /></td>
                    <td><input asp-for="@Model.Issue.Comments[i].LastUpdated" type="hidden" /></td>
                    <td>
                        <input asp-for="@Model.Issue.Comments[i].DateCreated" class="form-control" type="date" asp-format="{0:yyyy-MM-dd}" />
                    </td>
                    <td>
                        <input asp-for="@Model.Issue.Comments[i].Narrative" class="form-control" />
                    </td>
                    <td>
                        <button asp-action="DeleteReturnIssueComment" asp-route-id=@Model.Issue.Comments[i].ID class="btn btn-primary">
                            <span class="glyphicon glyphicon-trash" />
                        </button>
                    </td>
                </tr>
            }

现在,使用@Model而不是@comment来引用这些项目,所有内容都可以很好地绑定在一起,并且我可以在控制器中看到注释。

我不相信有一种方法可以不通过形式传递值。 您可以使用隐藏字段来存储要传递回服务器的数据。 这是为表格中现有模型字段创建隐藏字段的剃刀语法。

@Html.HiddenFor(x => x.HiddenFieldName)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM