同一视图中的第二个模型未发布到控制器

时间:2014-03-13 23:52:21

标签: asp.net-mvc asp.net-web-api

在几个SO问题的帮助下,我已经找到了如何使用元组形式在同一视图上使用两个模型。我文件的顶部是:

@using Project.Models;
@{
    ViewBag.Title = "Details";
    Layout = "~/Views/Shared/_Layout.cshtml";
    @model Tuple<Foo, Bar>
}

对于 Foo 的东西,它使用这样的jQuery:

@Html.DisplayFor(tuple => tuple.Item1.ID)

并且工作正常。但是,对于我的第二个模型,它不是显示信息,而是一个提交表单。目前,这就是我所拥有的:

@using (Html.BeginForm(null, null, FormMethod.Post, new { id = "createFoo", @action = "/api/Foo" }))
{
@Html.AntiForgeryToken()
@Html.ValidationSummary(true)

    <div class="editor-field">
        @Html.TextAreaFor(tuple => tuple.Item2.Text)
        @Html.ValidationMessageFor(tuple => tuple.Item2.Text)<br />
    </div>

    <input type="submit" value="Post Response" />
}

请注意,这主要是来自其他视图的复制粘贴,因为我是MVC的新手,并且它可以与其他表单一起使用。对于我的FooController,我有这个:

public void Post([FromBody] Foo foo)
        {
            Foo existingFoo = this.fooRepository.GetFoo(foo.ID);
            if (existingFoo != null)
            {
                // throw error
            }
            else
            {
                System.Diagnostics.Debug.WriteLine("MESSAGE POSTING: " + foo.Text);
            }
        }

从视图提交时,收到的foo不为空(在其他测试中检查),但foo.text为空。我已经尝试了很多不同的输入等等,但我对@ Html。*函数和ASP.net-MVC一般都不熟悉,我不知道我可以去哪里错。

如果你需要查看我的存储库代码让我知道,但我怀疑它会对此产生影响。提前感谢您的帮助。

1 个答案:

答案 0 :(得分:2)

我可以在上面的代码中看到两个问题:

  1. Html助手将输出您的字段的方式以及如何将其输入您的api帖子
  2. 控制器中没有您的ID。
  3. 1:输出这样的字段(@Html.TextAreaFor(tuple => tuple.Item2.Text))会为该字段指定名称"Item2.Text"。这是一个问题,因为这是在帖子上传递的内容。您将获得Item2.Text:dfsdsgdfg的表单数据。当您的API控制器尝试绑定时,这将不匹配。因此,请尝试使用集名称输出文本字段:

    @Html.TextArea("Text", @Model.Item2.Text)
    

    2:您的Id字段不在表单中......因此不会发送。尝试使用隐藏字段:

    @Html.Hidden("ID", @Model.Item1.ID)
    

    另外,只是澄清一下,这个(@Html.DisplayFor(tuple => tuple.Item1.ID))不是jQuery。