在ViewModel c#ASP.Net 5中使用接口

在ViewModel c#ASP.Net 5中使用接口,c#,model-view-controller,C#,Model View Controller,我有一些问题 我有下一个型号: public class DocumentViewModel { public string Nazvanie { get; set; } public Author DocumentAutors { get; set; } } public class Author { public long Id { get; set; } public List<IPerson> Authors { get; set; }

我有一些问题

我有下一个型号:

 public class DocumentViewModel
{
    public string Nazvanie { get; set; }

    public Author DocumentAutors { get; set; }
}

public class Author
{
    public long Id { get; set; }

    public List<IPerson> Authors { get; set; }
}

public interface IPerson
{
    long Id { get; set; }
}

public class PersonUL : IPerson
{
    public long Id { get; set; }

    public string Name { get; set; }

    public string Address { get; set; }
}

public class PersonIP : IPerson
{
    public long Id { get; set; }

    public string FirstName { get; set; }

    public string SecondNAme { get; set; }

    public string PostAddress { get; set; }
}
公共类DocumentViewModel
{
公共字符串Nazvanie{get;set;}
公共作者文档编辑器{get;set;}
}
公共类作者
{
公共长Id{get;set;}
公共列表作者{get;set;}
}
公共接口IPerson
{
长Id{get;set;}
}
公共类人员:IPerson
{
公共长Id{get;set;}
公共字符串名称{get;set;}
公共字符串地址{get;set;}
}
公共类人物:IPerson
{
公共长Id{get;set;}
公共字符串名{get;set;}
公共字符串SecondNAme{get;set;}
公共字符串后地址{get;set;}
}
In.cshtml

@model DocumentViewModel
 @if (Model.DocumentAutors.Authors  != null && Model.DocumentAutors.Authors.Count > 0)
{
    for (int i = 0; i < Model.DocumentAutors.Authors.Count; i++)
    {
      if (Model.DocumentAutors.Authors is PersonUL )
      {
            <div class="form-group">
                <label asp-for="@Model.DocumentAutors.Authors[i].Name" class="col-md-10 control-label"></label>
                <div class="col-md-10">
                    <input asp-for="@Model.DocumentAutors.Authors[i].Name" class="form-control" />
                    <span asp-validation-for="@Model.DocumentAutors.Authors[i].Name" class="text-danger"></span>
                </div>
            </div>

        }

    }

}
@model DocumentViewModel
@if(Model.documentutors.Authors!=null&&Model.documentutors.Authors.Count>0)
{
for(int i=0;i
Model.documentutors.Authors[i]不包含“Name”字段,因为它是一个接口。我需要投,但如果我写

 if (Model.DocumentAutors.Authors is PersonUL )
      {
          PersonUL ul = (PersonUL)Model.DocumentAutors.Authors[i];
            <div class="form-group">
                <label asp-for="@ul.Name" class="col-md-10 control-label"></label>
                <div class="col-md-10">
                    <input asp-for="@ul.Name" class="form-control" />
                    <span asp-validation-for="@ul.Name" class="text-danger"></span>
                </div>
            </div>

        }
if(Model.documentutors.Authors为个人)
{
PersonUL=(PersonUL)Model.documentutors.Authors[i];
}
我会得到像这样的错误名称的html

<input class="form-control" type="text"  id="Name" name="Name" value="566">

反而

<input class="form-control" type="text"  id="DocumentAutors.Authors[0].Name" name="DocumentAutors.Authors[0].Name" value="566">

ModelBinder不会将此字段合并到作者列表中


这个问题有解决方案吗?或者我应该为PersonUL和PersonIP创建一个通用模型来处理所有字段,我真的不喜欢它吗?

很抱歉,但是我不认为这个界面有任何优势。这只会使代码更加混乱

你为什么不试试

public class Author
{
    public long Id { get; set; }

    public List<PersonIP> IpAuthors { get; set; }
    public List<PersonUL> UlAuthors { get; set; }
}
公共类作者
{
公共长Id{get;set;}
公共列表IpAuthors{get;set;}
公共列表作者{get;set;}
}
甚至更好

public class DocumentViewModel
{
    public string Nazvanie { get; set; }

     public long AuthorId { get; set; }

    public List<PersonIP> IpAuthors { get; set; }
    public List<PersonUL> UlAuthors { get; set; }
}
公共类DocumentViewModel
{
公共字符串Nazvanie{get;set;}
公共长作者{get;set;}
公共列表IpAuthors{get;set;}
公共列表作者{get;set;}
}

这是通过类比数据所针对的XSD模式来实现的。元素。您始终可以将数据从viewmodel转换为任何模式,或者相反,将数据从模式转换为viewmodel。这甚至与模式无关,我不知道如何实现动态标记。用户应该能够选择Person对象的类型及其计数。逻辑上应该是一个列表。两个列表的存在对我计划做的标记施加了限制。带有人员类型和相应字段的组合框,以及用于添加新人员的按钮。这取决于您,但我认为最好有两个标记。易于阅读和维护