Asp.net mvc 同一视图中的第二个模型未过帐到控制器

Asp.net mvc 同一视图中的第二个模型未过帐到控制器,asp.net-mvc,asp.net-web-api,Asp.net Mvc,Asp.net Web Api,在几个SO问题的帮助下,我已经了解了如何使用元组形式在同一个视图上使用两个模型。在我的文件顶部是: @using Project.Models; @{ ViewBag.Title = "Details"; Layout = "~/Views/Shared/_Layout.cshtml"; @model Tuple<Foo, Bar> } 而且效果很好。然而,对于我的第二个模型,它不是显示信息,而是一个提交表单。目前,我所拥有的是: @using (Html.

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

@using Project.Models;
@{
    ViewBag.Title = "Details";
    Layout = "~/Views/Shared/_Layout.cshtml";
    @model Tuple<Foo, Bar>
}
而且效果很好。然而,对于我的第二个模型,它不是显示信息,而是一个提交表单。目前,我所拥有的是:

@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" />
}
从视图提交时,收到的foo不是null(在其他测试中检查),但foo.text是空的。我尝试了很多不同的输入等等,但我对@Html.*函数和ASP.net-MVC一般来说太不熟悉了,所以我不确定哪里会出错


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

以上代码中有两个问题:

  • Html
    helper将输出字段的方式,以及如何将这些字段输入到api帖子中
  • 控制器中没有您的ID 1:输出这样的字段(
    @Html.TextAreaFor(tuple=>tuple.Item2.Text)
    )将为字段命名为
    “Item2.Text”
    。这是一个问题,因为这是在帖子上传递的内容。您将使用
    项2获取表单数据。文本:dfsdsgdfg
    。当API控制器尝试绑定时,这将不匹配。因此,请尝试使用设置的名称输出文本字段:

    @Html.TextArea("Text", @Model.Item2.Text)
    
    2:您的Id字段不在表单中。。。因此它不会被发送。尝试使用隐藏字段:

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

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

    您确实意识到MVC和WebAPI是两个完全不同的框架,您不能在另一个框架中混合和匹配属性。。。正确的?API操作不是为表单设计的,它们是为接受JSON或XML或类似的东西而设计的;如果你想处理POST数据,你必须这么做。@Aaronaught:我隐约知道,但我对这个框架还是非常非常陌生,所以很多事情对我来说仍然很神秘。谢谢你的链接,它和上面的其他资源一样有用。非常感谢你,它成功了。然而,我不喜欢对@Html的东西感到困惑,你有没有一个好的链接来解释你对返回的Html.TextArea的评论,以及它与Html.TextArea的区别。正如Aaronaught提到的,我知道它正在寻找一种在两个框架之间交互的方法,所以我知道的越多,就越容易。再次感谢,伙计。这里有一个链接,讨论与不同Html助手的区别:。本质上没有太大的区别,我怀疑
    For
    方法调用了引擎盖下的另一个方法。有两种不同的方法可以获得非常相似的HTML输出。在你的例子中,使用
    Html.TextArea
    helper方法更容易。至于混合使用MVC和WebAPI,我认为你做的很好,WebAPI支持
    application/x-www-form-urlencoded
    开箱即用的内容。最简单的方法是发送复杂类型(您就是这样)。
    @Html.TextArea("Text", @Model.Item2.Text)
    
    @Html.Hidden("ID", @Model.Item1.ID)