asp.net mvc razor重用编辑器视图进行显示(带自定义助手)

时间:2011-08-26 15:13:05

标签: asp.net-mvc view razor reusability

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

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

当它只读时它只显示变量,当它不显示时,它显示一个文本框。除了这个助手之外,我在视图中需要一些if,但是如果可能的话,它会节省几百行代码。

2 个答案:

答案 0 :(得分:3)

刚刚找到了另一种选择(我认为非常简洁):

    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)));
        }

    } 

答案 1 :(得分:1)

你可以做两件事来帮助你。

扩展方法

首先是编写一个扩展方法,允许您构建一个符合您规范的输入框,例如:

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());
    }
}

您现在可以按照自己的描述使用它。

部分观点

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