表单只发布ASP.NET Core中模型的一部分

时间:2018-03-07 09:50:07

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

模型

public class ChildModel
{
    public string Item1 { get; set; }
    public string Item2 { get; set; }
}

public class ParentModel
{
    public ChildModel Child { get; set; }
}

查看

<div class="row">
    <div class="col-sm-8">
        <p>@Model.Child.Item1</p>
        <p>@Model.Child.Item2</p>
        <form asp-controller="home" asp-action="submit" method="post">
            <input asp-for="Child.Item1" hidden />
            <input asp-for="Child.Item2" hidden />
            <div class="form-group">
                <button type="submit" class="btn btn-dark mr-2 px-4">Submit</button>
            </div>
        </form>
    </div>
</div>

控制器

[HttpGet]
public IActionResult Index()
{
    return View(new ParentModel
    {
        Child = new ChildModel
        {
            Item1 = "Item 1",
            Item2 = "Item 2",
        }
    });
}

[HttpPost]
public IActionResult Submit(ChildModel m)
{
    //ModelState.IsValid is true, but m.Item1 is null and m.Item2 is null
    if (!ModelState.IsValid)
        return View(m);

    return RedirectToAction("index");
}

我要做的是回复我的模特的一个成员。我的假设是MVC模型绑定将从表单数据中获取Item1Item2成员,我将能够在我的Submit帖子中访问它们。但在Submit方法中,Item1Item2始终为空。

请问你能说明我做错了什么,或者可能采用其他方法来达到同样的效果?

1 个答案:

答案 0 :(得分:1)

由于您正在修改模型结构,因此需要更改输入的名称:

<input asp-for="Child.Item1" name="Item1" hidden />
<input asp-for="Child.Item2" name="Item2" hidden />

否则,生成的HMTL看起来像... name="Child.Item1"...,并且由于您的模型没有Child属性,如您所见,它会失败。