Asp.net mvc 5 继承类和razor asp.net mvc 5
早上好,我在返回我的视图Razor的数据库信息(使用EF 6 code first方法生成)时遇到问题。问题是我想从视图中的继承类返回信息,但它们不可用,只显示基类的属性,而不是依赖类的属性。 以下是使用的模型、控制器和视图类: 类ClientModelAsp.net mvc 5 继承类和razor asp.net mvc 5,asp.net-mvc-5,Asp.net Mvc 5,早上好,我在返回我的视图Razor的数据库信息(使用EF 6 code first方法生成)时遇到问题。问题是我想从视图中的继承类返回信息,但它们不可用,只显示基类的属性,而不是依赖类的属性。 以下是使用的模型、控制器和视图类: 类ClientModel public class Client { [DatabaseGenerated(DatabaseGeneratedOption.Identity)] public int ClientId { get; set; }
public class Client
{
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public int ClientId { get; set; }
[DataType(DataType.Date)]
public DateTime Birth { get; set; }
[Display(Name = "Telefone principal")]
public string Phone1 { get; set; }
[Display(Name = "Telefone Alternativo")]
public string Phone2 { get; set; }
public ICollection<OrcamentoContato> Contacts { get; set; }
public ICollection<Contrato> Contracts { get; set; }
}
类法律模型
public class PessoaJuridica : Client
{
public TipoPessoa PersonType { get; set; }
[Required]
[Display(Name = "Razão Social*")]
[StringLength(200, ErrorMessage = "O campo é obrigatório.")]
public string SocialName { get; set; }
[Required]
[Display(Name = "CNPJ*")]
[StringLength(200, ErrorMessage = "O campo é obrigatório.")]
public string CNPJ { get; set; }
[Display(Name = "Inscrição Estadual")]
public string InscricaoEstadual { get; set; }
[Display(Name = "Inscrição Municipal")]
public string InscricaoMunicipal { get; set; }
[Display(Name = "Endereço")]
public string Address { get; set; }
public string ContactWith { get; set; }
}
控制器
public ActionResult Index()
{
var clients = db.Clients.ToList();
return View(clients);
}
索引视图
@model IEnumerable<CabinePhoto.Models.Entidades.Client>
<table class="table">
<tr>
<th>
@Html.DisplayNameFor(model => model.Birth)
</th>
<th>
@Html.DisplayNameFor(model => model.Phone1)
</th>
<th>
@Html.DisplayNameFor(model => model.Phone2)
</th>
<th></th>
</tr>
@foreach (var item in Model) {
<tr>
<td>
@Html.DisplayFor(modelItem => item.Birth)
</td>
<td>
@Html.DisplayFor(modelItem => item.Phone1)
</td>
<td>
@Html.DisplayFor(modelItem => item.Phone2)
</td>
</tr>
}
@model IEnumerable
@DisplayNameFor(model=>model.Birth)
@DisplayNameFor(model=>model.Phone1)
@DisplayNameFor(model=>model.Phone2)
@foreach(模型中的var项目){
@DisplayFor(modelItem=>item.Birth)
@DisplayFor(modelItem=>item.Phone1)
@DisplayFor(modelItem=>item.Phone2)
}
识别模型
public DbSet<Client> Clients { get; set; }
public DbSet<PessoaFisica> PessoaFisica { get; set; }
public DbSet<PessoaJuridica> PessoaJuridica { get; set; }
公共数据库集客户端{get;set;}
公共数据库集PessoaFisica{get;set;}
公共数据库集PessoaJuridica{get;set;}
所有信息都存储在同一个客户机表中,因为我使用的是按层次结构继承的形式,但在视图中只返回客户机模型信息假设控制器中有这样一个变量
Client c = new Client();
如果你后来写信
c.ClientId = 1;
它将完美地工作
同样,如果你写
PessoaFisica p = new PessoaFisica ();
后来
p.Name = "abc";
它也会起作用
然而,如果你写
Client c = new PessoaFisica();
c.Name = "abc";
它将无法编译
一脉相承
@model IEnumerable <CabinePhoto.Models.Entidades.Client>
@model IEnumerable
表示您的
模型的静态类型是客户机
对象的集合,它只允许您绑定到客户机
类中定义的属性。假设您的控制器中有这样一个变量
Client c = new Client();
如果你后来写信
c.ClientId = 1;
它将完美地工作
同样,如果你写
PessoaFisica p = new PessoaFisica ();
后来
p.Name = "abc";
它也会起作用
然而,如果你写
Client c = new PessoaFisica();
c.Name = "abc";
它将无法编译
一脉相承
@model IEnumerable <CabinePhoto.Models.Entidades.Client>
@model IEnumerable
表示您的模型的静态类型
是客户端
对象的集合,它只允许您绑定到客户端
类中定义的属性。实体框架实际返回正确的类型,但是,通过存储到的变量类型和视图的模型定义,可以有效地将所有内容向上转换到客户端。本质上,您只需要转换到正确的类型。不幸的是,在它被升级后,没有办法知道它应该是什么类型。您必须有条件地检查:
if (item is PessoaFisica)
{
var pessoaFiscica = (PessoaFisica)item;
// now you can access those derived typed properties off of `pessoaFiscica`
}
您还可以将用作
,并依赖以下事实,即当无法铸造某些内容时,它返回null:
var pessoaFiscica = item as PessoaFisica;
if (pessoaFiscica != null)
{
// access PessoaFiscica properties
}
使用C#7.0,您可以使用模式匹配语法稍微简化它:
if (item is PessoaFiscica pessoaFiscica)
{
// use `pessoaFiscica`
}
模式匹配语法还允许您使用开关块,这可能会使您的工作更轻松:
switch (item)
{
case PessoaFisica pessoaFisica:
// do something with `PessoaFisica` instance
break;
case PessoaJuridica pessoaJuridica:
// do something with `PessoaJuridica` instance
break;
default:
// do something with generic `Client` instance
break;
}
实体框架实际上返回了正确的类型,但实际上是通过存储到的变量类型和视图的模型定义将所有内容向客户机
上传。本质上,您只需要转换到正确的类型。不幸的是,在它被升级后,没有办法知道它应该是什么类型。您必须有条件地检查:
if (item is PessoaFisica)
{
var pessoaFiscica = (PessoaFisica)item;
// now you can access those derived typed properties off of `pessoaFiscica`
}
您还可以将用作
,并依赖以下事实,即当无法铸造某些内容时,它返回null:
var pessoaFiscica = item as PessoaFisica;
if (pessoaFiscica != null)
{
// access PessoaFiscica properties
}
使用C#7.0,您可以使用模式匹配语法稍微简化它:
if (item is PessoaFiscica pessoaFiscica)
{
// use `pessoaFiscica`
}
模式匹配语法还允许您使用开关块,这可能会使您的工作更轻松:
switch (item)
{
case PessoaFisica pessoaFisica:
// do something with `PessoaFisica` instance
break;
case PessoaJuridica pessoaJuridica:
// do something with `PessoaJuridica` instance
break;
default:
// do something with generic `Client` instance
break;
}
我已经解决了这个问题。我将在这里记录我为解决继承问题所做的工作
首先,我创建了一个ViewModel并放置了两个ICollection属性,我通过添加引用客户机表的查询修改了控制器,但特别引入了所需的类型,最后,我将ViewModel传递给Index.cshtml,并使用两个foreach根据指定的类型从中检索信息,如下所示:
ClientesiewModel.cs
public class ClientesViewModel
{
public IEnumerable<PessoaFisica> Fisica { get; set; }
public IEnumerable<PessoaJuridica> Juridica { get; set; }
}
public类ClientesViewModel
{
公共IEnumerable Fisica{get;set;}
公共IEnumerable Juridica{get;set;}
}
电子控制系统
public ActionResult Index()
{
var cliente_fisico = db.Clientes.OfType<PessoaFisica>().ToList();
var cliente_juridico = db.Clientes.OfType<PessoaJuridica>().ToList();
var cliente = db.Clientes.ToList();
ClientesViewModel clientes = new ClientesViewModel()
{
Fisica = cliente_fisico,
Juridica = cliente_juridico
};
return View(clientes);
}
public ActionResult Index()
{
var cliente_fisico=db.Clientes.OfType().ToList();
var cliente_juridico=db.Clientes.OfType().ToList();
var cliente=db.Clientes.ToList();
ClientesViewModel clientes=新的ClientesViewModel()
{
Fisica=客户和fisico,
Juridica=客户
};
返回视图(客户);
}
View Index.cshtml
@model CabinePhoto.ViewModels.ClientesViewModel
<table class="table">
<tr>
<th>
@Html.DisplayName("Nome")
</th>
<th>
@Html.DisplayName("Telefone")
</th>
<th>
@Html.DisplayName("Telefone 2")
</th>
<th></th>
</tr>
@if (Model.Fisica != null || Model.Juridica != null)
{
foreach (var fisica in Model.Fisica)
{
<tr>
<td>
@Html.DisplayFor(modelItem => fisica.NomeCompleto)
</td>
<td>
@Html.DisplayFor(modelItem => fisica.TelefonePrincipal)
</td>
<td>
@Html.DisplayFor(modelItem => fisica.TelefoneAlternativo)
</td>
<td>
@Html.ActionLink("Edit", "Edit", new { id = fisica.ClienteId }) |
@Html.ActionLink("Details", "Details", new { id = fisica.ClienteId }) |
@Html.ActionLink("Delete", "Delete", new { id = fisica.ClienteId })
</td>
</tr>
}
foreach (var juridica in Model.Juridica)
{
<tr>
<td>
@Html.DisplayFor(modelItem => juridica.PessoaContato)
</td>
<td>
@Html.DisplayFor(modelItem => juridica.CNPJ)
</td>
<td>
@Html.DisplayFor(modelItem => juridica.TelefonePrincipal)
</td>
<td>
@Html.ActionLink("Edit", "Edit", new { id = juridica.ClienteId }) |
@Html.ActionLink("Details", "Details", new { id = juridica.ClienteId }) |
@Html.ActionLink("Delete", "Delete", new { id = juridica.ClienteId })
</td>
</tr>
}
}
</table>
@model CabinePhoto.ViewModels.clientsviewmodel
@Html.DisplayName(“Nome”)
@Html.DisplayName(“Telefone”)
@Html.DisplayName(“Telefone 2”)
@如果(Model.Fisica!=null | | Model.Juridica!=null)
{
foreach(Model.fisica中的var fisica)
{
@DisplayFor(modelItem=>fisica.NomeCompleto)
@DisplayFor(modelItem=>fisica.TelefonePrincipal)
@DisplayFor(modelItem=>fisica.telefonealternative)
@ActionLink(“编辑”,“编辑”,新的{id=fisica.ClienteId})|
@ActionLink(“详细信息”,“详细信息”,新的{id=fisica.ClienteId})|
@ActionLink(“删除”,“删除”,新的{id=fisica.ClienteId})
}
foreach(var-ju)