【问题标题】:MVC4 Razor - @Html.DisplayFor not binding to modelMVC4 Razor - @Html.DisplayFor 未绑定到模型
【发布时间】:2012-06-18 21:27:53
【问题描述】:

我正在尝试使用 MVC4 Razor 找到自己的脚,但我遇到了这个简单的问题。

当我使用@Html.DisplayFor 时,模型总是返回为NULL,但是当我使用@Html.TextBoxFor 时,这个模型是完全填充的,我缺少什么?

提前致谢

【问题讨论】:

  • 我需要将字段显示为“标签”。这就是为什么;此视图的目的是使用户能够在将数据提交到数据库之前查看数据。有什么想法可以实现吗?

标签: asp.net-mvc razor


【解决方案1】:

这是很多人在asp.net mvc框架中忽略的一个常见问题。不仅是HiddenForDisplayForTextBoxFor 等帮助程序的不同,还包括框架如何自动设置并自动收集和验证这些输入。神奇的是 HTML5 的 data-* 属性。在查看生成的输入标签时,您会注意到会有一些额外的属性以data-valdata-val-required 的形式出现,并且可能还有一些类型的额外数据属性,例如数字将是data-val-number

这些数据属性允许 jQuery 扩展 jquery.validate.unobtrusive.js 解析 DOM,然后决定验证哪些字段或生成错误消息。

发布数据的实​​际收集反映在name 属性中。这应该映射到 c# 或 vb [HttpPost] 方法中的模型。

当您想要提供用户不需要注意的发布数据时,请使用HiddenFor

当您想显示记录但不允许对其进行编辑时,请使用 DisplayFor

当您想要允许用户输入或允许用户编辑字段时,请使用TextBoxFor

编辑

"the purpose of this view is to enable the user to view the data before submitting it to the database. Any ideas how I can achieve this?"

您可以使用 HiddenForDisplayFor 的二重奏来完成此操作。使用HiddenFor 准备发布值,使用DisplayFor 显示这些值。

【讨论】:

  • 你好。谢谢。
【解决方案2】:

DisplayFor 不会进行模型绑定。 TextBoxFor 会这样做,因为它会在表单中创建一个 input 元素,并且表单可以在发布时处理它。如果您想在 HttpPost 操作中获取一些数据并且您不想使用 TextBoxFor,您可以使用像这样的HiddenFor HTML 帮助器方法将该 pirticulare 模型属性保存在表单内的隐藏变量中。

@using(Html.BeginForm())
{
  <p>The Type Name is</p> @Html.DisplayFor(x=>x.TypeName)
  @Html.HiddenFor(x=>x.TypeName)
  <input type="submit" value="Save" />
}

【讨论】:

  • 嗨 Shyju,我需要将字段显示为“标签”。这就是为什么;此视图的目的是使用户能够在将数据提交到数据库之前查看数据。有什么想法可以实现吗?
【解决方案3】:

同时使用DisplayForHiddenForDisplayFor 只是显示文本而不是输入字段,因此不会回发。 HiddenFor 实际上创建了&lt;input type="hidden" value="xxxx"/&gt;

【讨论】:

    【解决方案4】:

    DisplayFor 构建了一个 HTML 标签,而不是一个输入。标签不会 POST 到服务器,但输入会。

    【讨论】:

      【解决方案5】:

      您的意思是在表单发布期间?如果您使用 DisplayFor,这将创建一个不包含任何表单值的元素。通常,您将它们结合使用来为您的文本框创建标签,然后使用 Html.TextBoxFor 允许用户修改数据元素。

      例子:

      @Html.DisplayFor(x=>x.Item)
      @Html.TextBoxFor(x=>x.Item)
      

      将渲染

      Item <a text input field following>
      

      或者在 HTML 中

      <label for="Item">Item</label><input type="Text" id="Item" name="Item"/>
      

      【讨论】:

        【解决方案6】:

        我知道这是一个老问题,但您可以滚动自己的自定义组合显示控件,如下所示。这会呈现模型值,然后是该值的隐藏字段

        @Html.DisplayExFor(model => Model.ItemCode)
        

        只需使用框架已有的内容

        public static MvcHtmlString DisplayExFor<TModel, TProperty>(this HtmlHelper<TModel> htmlHelper, Expression<Func<TModel, TProperty>> ex)
        {
            var sb = new StringBuilder();
            sb.Append(htmlHelper.DisplayFor(ex));
            sb.Append(htmlHelper.HiddenFor(ex));
        
            return MvcHtmlString.Create(sb.ToString());
        }
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-10-02
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多