Asp.net mvc 5 继承类和razor asp.net mvc 5

Asp.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; }

早上好,我在返回我的视图Razor的数据库信息(使用EF 6 code first方法生成)时遇到问题。问题是我想从视图中的继承类返回信息,但它们不可用,只显示基类的属性,而不是依赖类的属性。 以下是使用的模型、控制器和视图类:

类ClientModel

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)