我试图找到MVC4 Razor的脚,我仍然坚持这个简单的问题。
当我使用@ Html.DisplayFor时,模型总是以NULL形式返回,但是当我使用@ Html.TextBoxFor这个模型完全填充时,我缺少什么?
提前致谢
答案 0 :(得分:58)
这是许多人在asp.net mvc框架中遗漏的常见问题。不仅仅是帮助者的差异,例如HiddenFor
,DisplayFor
,TextBoxFor
- 而且框架如何设置自动收集和验证这些输入。魔术都是用HTML5的data- *属性完成的。您会注意到,在查看生成的输入标记时,将会以data-val
,data-val-required
的形式出现一些额外的属性,并且可能还有一些类型的其他数据属性,例如数字将是{ {1}}。
这些数据属性允许jQuery扩展data-val-number
解析DOM,然后决定要验证哪些字段或生成错误消息。
发布数据的实际收集反映在jquery.validate.unobtrusive.js
属性中。这应该映射到c#或vb name
方法中的模型。
如果您想提供用户不需要注意的发布数据,请使用[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?"
和HiddenFor
这两个人完成此操作。使用DisplayFor
准备好发布值,并HiddenFor
显示这些值。
答案 1 :(得分:15)
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" />
}
答案 2 :(得分:1)
DisplayFor
构建HTML标签,而不是输入。标签未发布到服务器,但输入是。
答案 3 :(得分:0)
你的意思是在表格发布期间?如果使用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"/>
答案 4 :(得分:0)
我知道这是一个老问题,但是您可以滚动自己的自定义组合显示控件,如下所示。这将呈现模型值,然后是该值的隐藏字段
@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());
}