我想要显示一些文本,但也可以通过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语法,您只需使用它:
<%= Html.DisplayWithIdFor(x => x.Name) %>
和:
<%= Html.DisplayWithIdFor(x => x.Name,"span") %>