如何在视图之间共享包含Html.TextVoxFor的样板代码?

时间:2011-11-19 14:24:02

标签: asp.net-mvc asp.net-mvc-3

我有类似以下的课程。这是许多具有相同属性的类,例如CreatedBy和ModifiedBy:

public class Test1 {
    [DisplayName("Created By")]
    public string CreatedBy { get; set; }
    [DisplayName("Modified By")]
    public string ModifiedBy { get; set; }
}
public class Test2 {
    [DisplayName("Created By")]
    public string CreatedBy { get; set; }
    [DisplayName("Modified By")]
    public string ModifiedBy { get; set; }
}

我想有一个代码块,我在这些类的不同视图中重用。代码块应该具有数据格式,例如:

        <div class="a">
            @Html.LabelFor(model => model.Note.CreatedBy)
            @Html.TextBoxFor(model => model.Note.CreatedBy)
        </div>
        <div class="b">
            @Html.LabelFor(model => model.Note.ModifiedBy)
            @Html.TextBoxFor(model => model.Note.ModifiedBy)
        </div>

我查看了几种不同的方法,最初使用一个类来保存所有修改和创建的数据。我的解决方案基于此:

Another solution

但是现在我被告知我不能使用这个解决方案中使用的类,其中数据保存在RowInfo类中。我必须直接使用字段,如上面显示的Test1和Test2类。

任何人都可以建议我如何安排HTML代码被多个类重用。我知道我可以使用几种不同的方式,但我所知道的似乎都不允许我在共享相同字段的多个类之间共享代码。

我希望这是有道理的。如果不告诉我,我会解释更多。

2 个答案:

答案 0 :(得分:1)

您可以定义基本视图模型:

public abstract class BaseViewModel
{
    [DisplayName("Created By")]
    public virtual string CreatedBy { get; set; }
    [DisplayName("Modified By")]
    public virtual string ModifiedBy { get; set; }
}

然后从这个基本视图模型派生两个相似的视图模型(因为它们共享通用功能):

public class Test1 : BaseViewModel 
{
}

public class Test2 : BaseViewModel 
{
}

接下来,您可以为基本视图模型定义自定义编辑器模板(~/Views/Shared/EditorTemplates/BaseViewModel.cshtml):

@model BaseViewModel
<div class="a">
    @Html.LabelFor(model => model.CreatedBy)
    @Html.TextBoxFor(model => model.CreatedBy)
</div>
<div class="b">
    @Html.LabelFor(model => model.ModifiedBy)
    @Html.TextBoxFor(model => model.ModifiedBy)
</div>

作为旁注,您还可以使用接口而不是基本模型的抽象类:

public interface IBaseViewModel
{
    [DisplayName("Created By")]
    string CreatedBy { get; set; }
    [DisplayName("Modified By")]
    string ModifiedBy { get; set; }
}

并将键入的编辑器模板键入此界面。

然后为您的主视图模型:

public class MyViewModel
{
    public Test1 Test1 { get; set; }
    public Test2 Test2 { get; set; }
}

您可以使用EditorFor帮助程序调用自定义编辑器模板:

@model MyViewModel
@Html.EditorFor(x => x.Test1)
@Html.EditorFor(x => x.Test2)

答案 1 :(得分:0)

您是否尝试将代码放入局部视图中,然后可以在任何页面/视图中使用?