繁体   English   中英

MVC4 Razor - @ Html.DisplayFor不绑定到模型

[英]MVC4 Razor - @Html.DisplayFor not binding to model

我试图用MVC4 Razor找到我的脚,我坚持这个简单的问题。

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

提前致谢

这是许多人在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显示这些值。

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

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

同时使用DisplayForHiddenFor DisplayFor只显示文本而不是输入字段,因此不会回发。 HiddenFor实际创建<input type="hidden" value="xxxx"/>

DisplayFor构建HTML标签,而不是输入。 标签未发布到服务器,但输入是。

你的意思是在表格发布期间? 如果使用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"/>

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

@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());
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM