【问题标题】:Second model in same view not posting to controller同一视图中的第二个模型未发布到控制器
【发布时间】:2014-03-13 23:52:20
【问题描述】:

在几个 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 很不熟悉,所以我不确定我可能会出错。

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

【问题讨论】:

  • 你确实意识到 MVC 和 Web API 是两个完全不同的框架,你不能混合和匹配来自另一个的属性......对吗? API 操作不是为表单设计的,它们旨在接受 JSON 或 XML 或类似的东西;如果你想处理POST数据,你必须hack around it
  • @Aaronaught:我隐约知道,但我对这个框架仍然非常非常陌生,所以很多事情对我来说仍然很神秘。感谢您的链接,它和其他资源一样有用。

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


【解决方案1】:

上面的代码有两个问题:

  1. Html 帮助程序输出字段的方式以及这些字段如何输入到您的 api 帖子中
  2. 控制器中没有您的 ID。

1: 输出这样的字段 (@Html.TextAreaFor(tuple =&gt; 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 =&gt; tuple.Item1.ID)) 不是 jQuery。

【讨论】:

  • 非常感谢,它成功了。但是,我不喜欢对@Html 的东西感到困惑,你有一个很好的链接来解释你的 cmets 关于 Html.TextAreaFor 返回的内容以及它与 Html.TextArea 的不同之处。正如 Aaronaught 所提到的,我知道它正在寻找一种在两个框架之间进行交互的技巧,所以我知道的越多,它就越容易。再次感谢,伙计。
  • 这里是讨论不同 Html 助手的差异的链接:stackoverflow.com/questions/5908523/…。本质上没有太大区别,我怀疑For 方法在后台调用了另一个方法。这是获得非常相似的 HTML 输出的两种不同方法。在您的情况下,使用 Html.TextArea 辅助方法更容易。
  • 至于混合MVC和WebAPI,我觉得你做的很好,而且WebAPI支持application/x-www-form-urlencoded开箱即用的内容。使用发送复杂类型(您就是)最简单。
猜你喜欢
  • 1970-01-01
  • 2016-12-22
  • 1970-01-01
  • 1970-01-01
  • 2012-12-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多