Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-mvc/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Asp.net mvc 如何在视图之间共享包含Html.TextVoxFor的样板代码?_Asp.net Mvc_Asp.net Mvc 3 - Fatal编程技术网

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

Asp.net mvc 如何在视图之间共享包含Html.TextVoxFor的样板代码?,asp.net-mvc,asp.net-mvc-3,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 { [Disp

我有如下的课程。这是许多具有相同少数属性的类,例如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>

@LabelFor(model=>model.Note.CreatedBy)
@Html.TextBoxFor(model=>model.Note.CreatedBy)
@LabelFor(model=>model.Note.ModifiedBy)
@Html.TextBoxFor(model=>model.Note.ModifiedBy)
我研究了几种不同的方法,最初是使用一个类来保存所有修改和创建的数据。我的解决方案基于此:

但是现在有人告诉我,我不能使用此解决方案中使用的类,其中数据保存在类RowInfo中。我必须直接使用字段,就像我上面展示的类Test1和Test2一样

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


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

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

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

public abstract class BaseViewModel
{
    [DisplayName("Created By")]
    public virtual string CreatedBy { get; set; }
    [DisplayName("Modified By")]
    public virtual string ModifiedBy { get; set; }
}
public class MyViewModel
{
    public Test1 Test1 { get; set; }
    public Test2 Test2 { get; set; }
}
然后让两个相似的视图模型从此基础视图模型派生(因为它们共享公共功能):

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

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

然后,对于主视图模型:

public abstract class BaseViewModel
{
    [DisplayName("Created By")]
    public virtual string CreatedBy { get; set; }
    [DisplayName("Modified By")]
    public virtual 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)

那很好。但是如果我理解正确,我的局部视图需要指定一个模型,这些类的视图使用不同的模型。所以我不能分享一个片面的观点。如果我错了,请纠正我。谢谢,我有点困惑。我的类Test1和Test2是数据类,继承方式如下:“公共类Test1:TableServiceEntity”您的意思是将其称为“BaseViewModel”吗?它们也可以从多个类派生吗?@SamanthaJ,ASP.NET MVC中的规则1(对我来说也是最重要的规则):您永远不会将数据/域类传递给视图。始终定义和使用视图模型。视图模型是专门为视图需求定义的类。所以,如果您说Test1和Test2派生自某个TableServiceEntity,那么这些类永远不会到达您的视图。它们可以由控制器操作进行操作,但此操作应将它们映射到已定义的相应视图模型。是的,我使用的是viewModels。类Test1和Test2都有自己的视图模型,然后视图中有很多字段。在每个视图的底部,我想放置这个共享块。如果我使用一个编辑器模板,那么我可以将它用于特定的字段块吗?希望它有意义。@SamanthaJ,是的,您可以在条件Test1和Test2派生自公共基础视图模型的情况下,正如我在回答中所解释的那样。另一种可能是让他们实现一个公共接口,作为基本模型,然后将编辑器模板键入该接口。您还说Test1和Test2是视图模型,但同时它们都派生自一些
TableServiceEntity
域模型。这是一个矛盾。视图模型不是从域模型派生的,也没有任何域模型作为属性。这是对视图模型的错误印象。Test1和Test2是类。每个都有一个viewModel和一个view。对不起,我解释得不好。如何使视图模型实现公共接口。听起来很有可能?
@model MyViewModel
@Html.EditorFor(x => x.Test1)
@Html.EditorFor(x => x.Test2)