我希望能够显示一些文本,但也可以通过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") %>

10-07 14:56