我必须为我正在处理的项目制作大量表单。每种形式都有大量的领域。是否有可能创建一个HTML助手,可以显示一个元素或编辑元素取决于某些变量?也许有人已经尝试过了。我能想象,这将是这样的:asp.net mvc剃须刀重用编辑器视图显示(与定制帮手)
@Html.EditOrDisplayFor(m=>m.Field, isReadonly)
当它是只读的,只显示该变量,当它是不是显示了一个文本框。在这个帮手旁边,我需要一些如果在我的意见,但它可以节省几行100代码,如果这是可能的)
我必须为我正在处理的项目制作大量表单。每种形式都有大量的领域。是否有可能创建一个HTML助手,可以显示一个元素或编辑元素取决于某些变量?也许有人已经尝试过了。我能想象,这将是这样的:asp.net mvc剃须刀重用编辑器视图显示(与定制帮手)
@Html.EditOrDisplayFor(m=>m.Field, isReadonly)
当它是只读的,只显示该变量,当它是不是显示了一个文本框。在这个帮手旁边,我需要一些如果在我的意见,但它可以节省几行100代码,如果这是可能的)
刚刚找到一个替代(我觉得很巧妙的方法)来做到这一点:
public static MvcHtmlString EditOrDisplayFor<TModel, TValue>(this HtmlHelper<TModel> html, Expression<Func<TModel, TValue>> p,bool readOnly){
if (readOnly){
return new MvcHtmlString(string.Format("{0}", html.DisplayFor(p)));
} else{
return new MvcHtmlString(string.Format("{0}", html.EditorFor(p)));
}
}
你可以做两件事来帮助你在这里。
扩展方法
首先是编写扩展方法,使您可以构建一个输入框,您的要求,如:您现在可以根据你所描述的使用
public static class Extensions
{
public static string EditOrDisplayFor(this HtmlHelper helper, Field field, bool readOnly)
{
StringBuilder builder = new StringBuilder();
if(readOnly)
{
builder.Append(field.Value);
}
else
{
builder.Append("<input type=\"text\" name=\"")
.Append(field.Name)
.Append("\" value=\"")
.Append(field.Value)
.Append("\" />");
}
return helper.Raw(builder.ToString());
}
}
。
部分景色
如果这些形式最终在它们之间具有共同的分组,你可能要考虑把这些共同的部分中的部分观点,以减少冗余布局代码。
嗯,从来没有意识到它会这么容易。我想我使用这两个技巧,建立一些HtmlHelpers并使用部分视图。 – Patrick
嗨,我尝试现在实现它,但我真的有一个Field变量的问题。在哪个命名空间中? – Patrick