我希望能够显示一些文本,但也可以通过jQuery修改文本。
<%= Html.DisplayFor(model => model.DeviceComponentName)%>
如果我使用EditorFor而不是DisplayFor,我将看到输入控件的ID。我不希望该值以这种方式可编辑。因此,我将其设置为DisplayFor,但是它不会为该元素生成ID属性。
我是否应该将DisplayFor包装在div中并执行以下操作:
<div id="<%= ViewData.TemplateInfo.GetFullHtmlFieldName("DeviceComponentName") %>">
<%= Html.DisplayFor(model => model.DeviceComponentName)%>
</div>
$('#DeviceComponentName').text('newValue');
还是有一种更清洁的方式来实现这一目标?
更新:有没有一种方法不依赖于硬编码的字符串?与对象本身相关联的东西,因此如果我的属性名称更改,我会得到编译错误吗?
另外,我正在使用此代码,但是看不到ID值出现:
<td class="editableValue">
<%--Label should be editable, so it needs an ID, but only will be edited by jQuery so it can't be an EditorFor--%>
<%= Html.DisplayFor(model => model.DeviceComponentName, new { id = "DeviceComponentName" })%>
<button type="button" id="ComponentTreeButton" class="nestedDialogButton">...</button>
</td>
最佳答案
为避免输入“魔术字符串”(万一您的模型属性发生更改),可以使用扩展名进行输入。它还使代码更简洁:
public static MvcHtmlString DisplayWithIdFor<TModel, TValue>(this HtmlHelper<TModel> helper, Expression<Func<TModel, TValue>> expression, string wrapperTag = "div")
{
var id = helper.ViewContext.ViewData.TemplateInfo.GetFullHtmlFieldId(ExpressionHelper.GetExpressionText(expression));
return MvcHtmlString.Create(string.Format("<{0} id=\"{1}\">{2}</{0}>", wrapperTag, id, helper.DisplayFor(expression)));
}
然后像这样简单地使用它:
@Html.DisplayWithIdFor(x => x.Name)
会产生
<div id="Name">Bill</div>
或者,如果您希望将其包裹在一个范围内:
@Html.DisplayWithIdFor(x => x.Name, "span")
这将使:
<span id="Name">Bill</span>
非 Razor
对于非Razor语法,您可以像这样简单地使用它:
<%= Html.DisplayWithIdFor(x => x.Name) %>
和:
<%= Html.DisplayWithIdFor(x => x.Name, "span") %>