Asp.net mvc 同一视图中的第二个模型未过帐到控制器
在几个SO问题的帮助下,我已经了解了如何使用元组形式在同一个视图上使用两个模型。在我的文件顶部是: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.
@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帖子中@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)