MVC 模型未传递给控制器

Posted

技术标签:

【中文标题】MVC 模型未传递给控制器【英文标题】:MVC Model not passed to controller 【发布时间】:2014-03-18 18:33:45 【问题描述】:

我几乎感到尴尬,我无法让它发挥作用。我有一个这样的模型:

public class Test

  public string Test1 get; set; 
  public string Test2 get; set; 

我有一个正确显示 Test1 和 Test2 的剃刀视图。 Test1 显示如下:

@html.LabelFor(model => mode.Test1)
@Html.Test1

Test2 显示如下:

@Html.LabelFor(model => model.Test2)
@Html.EditorFor(model => model.Test2)

即我只想显示 Test1,但希望用户能够编辑 Test2。

这些都在一个表单中:

@using(Hmtl.BeginForm("Action1", "Controller1", FormMethod.Post)

在 Controller1.Action1 中接收模型:

public ActionResult Action1(Test m)



但在这里 m.Test1 为空,m.Test2 已正确填充。 m.test1 在视图中正确显示。

我很困惑.com

提前致谢,

【问题讨论】:

【参考方案1】:

模型绑定器仅查看从 HTML 表单发布的表单值,这些表单值仅来自表单元素。这不会生成这样的元素:

@Html.Test1

这可能会显示视图绑定的值(真的吗?我从来没有见过这样的做法,也许应该是@Model.Test1?)但需要有某种 HTML 表单元素将值发布回服务器。 (inputselecthidden 等)

为了好玩,看看在浏览器中生成的 HTML。它们只是带有值的标准表单元素,没有任何东西可以将整个模型存储在任何地方。模型绑定器只是尝试根据从 HTML 表单发送的名称/值对智能地重新构建模型。

尝试在表单中添加一个隐藏字段:

@Html.LabelFor(model => model.Test1)
@Model.Test1
@Html.HiddenFor(model => model.Test1)

这应该使用该值在表单中创建一个input type="hidden",在将值发布到控制器操作时将包含该值。

【讨论】:

知道了。是的,它应该是 @model.Test1 - 错字。那么如何使用嵌套对象呢?谢谢。 @RBrowning99:这让它有点复杂,但总体原理还是一样的。当您生成带有 @Html.TextBoxFor(model => model.NestedObject.Field1) 之类的字段时,请查看它生成的 input。在绑定中重新组装模型的关键是表单元素的name 属性,模型绑定器使用这些属性将值映射到预期的模型类型。 是的 - 真的没用,是吗?我想向它发送一个对象,然后让对象返回给我。我想我会将对象发送给它,然后返回对象的 PK 和时间戳,并在需要时在控制器中重新组装对象。 @RBrowning99:嗯,你不能把一个整个对象放在一个字段中。在 HTML 中,该字段的值只是文本。 (不过,您可能可以将整个对象序列化为单个字段,在操作方法上接受字符串输入,然后将其反序列化回一个对象。)您要么需要在页面上放置足够的数据元素以完全重新 -组装对象,或至少放置一个标识符,以便您可以根据该标识符重新获取对象。

以上是关于MVC 模型未传递给控制器的主要内容,如果未能解决你的问题,请参考以下文章

MVC4 不会将模型传递给控制器

获取 MVC 模型数据并将其传递给 AngularJS 控制器

如何序列化模型,将其传递给 ajax 请求中的 MVC 控制器

在 MVC 5 中,如何将表对象数据作为列表传递给控制器​​视图模型?

ASP.NET MVC & C#:将视图模型传递给控制器

PHP MVC 最佳实践 - 将 Session 变量从控制器传递给模型类或直接在模型中访问