在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对象的类型及其计数。逻辑上应该是一个列表。两个列表的存在对我计划做的标记施加了限制。带有人员类型和相应字段的组合框,以及用于添加新人员的按钮。这取决于您,但我认为最好有两个标记。易于阅读和维护