【问题标题】:Postback values getting lost!回发值丢失!
【发布时间】:2011-08-23 17:47:44
【问题描述】:

我有一个带有典型 create 方法的控制器(一个用于 GET,一个用于 POST)。 POST 采用强类型参数:

[HttpPost] public ActionResult Create(Quiz entity)

但是,当进行回调时,我的实体的属性为空......如果我像这样重新定义它:

[HttpPost] public ActionResult Create(Quiz entity, FormCollection form)

我可以看到这些值在那里,例如form["Component"] 包含 "1"。我过去没有遇到过这个问题,我不知道为什么这个类会有所不同。

有人想吗?

【问题讨论】:

    标签: asp.net-mvc asp.net-mvc-3 post controller strong-typing


    【解决方案1】:

    让默认模型绑定器在回发时为您实例化Quiz 的最简单方法是在您的视图中使用 Html 表单助手。因此,例如,如果您的 Quiz 类看起来像这样:

    public class Quiz
    {
        public int Id { get; set; }
        public string Name { get; set; }
    }
    

    您视图中的以下代码将确保回发时存在值:

    @Html.HiddenFor(mod => mod.Id)
    @Html.TextBoxFor(mod => mod.Name)
    

    请记住,需要回发但未在视图中显示的值(如标识符)需要使用Html.HiddenFor 添加到视图中。

    Here's a more comprehensive list 的 Html 表单辅助函数。

    【讨论】:

    • @ataddeini,我 am 使用 @Html 帮助程序来构建视图,我的类是由 EF 生成的,就像所有其他类一样。我真的不明白这里可能是什么问题......
    • @ekkis:好的。如果您可以提供视图标记和更多控制器代码,我很乐意仔细查看。
    • @ataddeini,代码相当不起眼。我认为可能发生的事情是我正在混合域......我有一个控制器来处理包含创建/编辑/删除/等方法的产品。但是,我还在那里创建方法来管理其他实体,例如ProductType - 本质上是糟糕的设计,我应该有一个产品类型的控制器,还是拥有一个处理多种类型实体的单个控制器是一种合理的方法?这可能是 /entity/ 没有被填充的原因吗?
    • 嗯...有一个问题可能会引起人们的兴趣。发布到控制器方法的表单是通过 ajax 完成的。这是它生成的代码:
    • <form action="/Question/Create" data-ajax="true" data-ajax-method="Post" id="form0" method="post"><div class="display-label">Level</div><div class="display-field"> <select id="Questions_0__Level_Level" name="Questions[0].Level.Level"><option selected="selected" value="1">Basic</option><option value="2">Intermediate</option><option value="3">Advanced</option></select></div><div class="display-field"><textarea class="text-box multi-line" id="Questions_0__Text" name="Questions[0].Text"> </textarea></div><button class="add">Add</button> </form>
    【解决方案2】:

    我想通了!!

    所以,在我的模型中(请参阅下面@ataddeini 线程上的 cmets),您可以看到我有一个组件...来表示组件我使用了几个列表框,第二个(组件)取决于第一个(产品)。在生成我使用的第二个列表时

    @Html.DropDownListFor(x => x.Component, ...)
    

    它(如上述链接之一所示)生成一个名为“组件”的表单字段......这就是问题所在。我需要做的是将它绑定到组件的 Id 上!

    @Html.DropDowListFor(x => x.Component.Id, ...)
    

    万岁!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-09-15
      • 1970-01-01
      • 2011-03-01
      • 2014-11-04
      • 1970-01-01
      • 1970-01-01
      • 2016-09-24
      • 2014-09-27
      相关资源
      最近更新 更多