Asp.net mvc 用于显示的asp.net mvc编辑器视图(带有自定义帮助程序)

Asp.net mvc 用于显示的asp.net mvc编辑器视图(带有自定义帮助程序),asp.net-mvc,view,razor,reusability,Asp.net Mvc,View,Razor,Reusability,我必须为我正在做的一个项目制作大量的表格。每个表单中都有大量字段。是否可以创建一个HTML帮助程序,根据某个变量显示元素或编辑元素?也许有人已经试过了。我可以想象它会是这样的: @Html.EditOrDisplayFor(m=>m.Field, isReadonly) 只读时,仅显示变量;非只读时,显示文本框。在这个助手旁边,我需要一些视图中的if,但是如果可能的话,它可以节省100行代码)您可以做两件事来帮助您 扩展方法 第一种方法是编写一个扩展方法,允许您使用规范构造输入框,例如:

我必须为我正在做的一个项目制作大量的表格。每个表单中都有大量字段。是否可以创建一个HTML帮助程序,根据某个变量显示元素或编辑元素?也许有人已经试过了。我可以想象它会是这样的:

@Html.EditOrDisplayFor(m=>m.Field, isReadonly)

只读时,仅显示变量;非只读时,显示文本框。在这个助手旁边,我需要一些视图中的if,但是如果可能的话,它可以节省100行代码)

您可以做两件事来帮助您

扩展方法

第一种方法是编写一个扩展方法,允许您使用规范构造输入框,例如:

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());
    }
}
公共静态类扩展
{
公共静态字符串EditOrDisplayFor(此HtmlHelper帮助程序,字段,bool只读)
{
StringBuilder=新的StringBuilder();
如果(只读)
{
builder.Append(field.Value);
}
其他的
{
生成器。追加(“”);
}
返回helper.Raw(builder.ToString());
}
}
正如您所描述的,您现在可以使用它

局部视图


如果这些表单之间有共同的分组,您可能需要考虑将这些常见的部分放在部分视图中以减少冗余的布局代码。

您可以在这里做两件事来帮助您。

扩展方法

第一种方法是编写一个扩展方法,允许您使用规范构造输入框,例如:

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());
    }
}
公共静态类扩展
{
公共静态字符串EditOrDisplayFor(此HtmlHelper帮助程序,字段,bool只读)
{
StringBuilder=新的StringBuilder();
如果(只读)
{
builder.Append(field.Value);
}
其他的
{
生成器。追加(“”);
}
返回helper.Raw(builder.ToString());
}
}
正如您所描述的,您现在可以使用它

局部视图

如果这些表单在它们之间有共同的分组,您可能需要考虑将这些常用的部分放在部分视图中以减少冗余的布局代码。

< P>只是找到了一个替代方案(我认为非常整洁的方式):

    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 MvcHtmlString EditOrDisplayFor(此HtmlHelper html,表达式p,bool只读){
如果(只读){
返回新的MvcHtmlString(string.Format({0}),html.DisplayFor(p));
}否则{
返回新的MvcHtmlString(string.Format({0}),html.EditorFor(p));
}
} 
刚刚找到了一种替代方法(我认为这是一种很好的方法):

    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 MvcHtmlString EditOrDisplayFor(此HtmlHelper html,表达式p,bool只读){
如果(只读){
返回新的MvcHtmlString(string.Format({0}),html.DisplayFor(p));
}否则{
返回新的MvcHtmlString(string.Format({0}),html.EditorFor(p));
}
} 

Hmm,没想到会这么容易。我想我使用了这两个技巧,构建了一些HTMLHelper,并使用了部分视图。嗨,我现在尝试实现它,但我确实对字段变量有问题。它是在什么名称空间中?嗯,从未意识到它会这么容易。我想我使用了这两个技巧,构建了一些HTMLHelper,并使用了部分视图。嗨,我现在尝试实现它,但我确实对字段变量有问题。它在什么名称空间中?