Отображение пользовательского объекта на основе двух классов (ViewModel и Domain Model)

Привет, я делаю проект, используя asp.net mvc 4.0, с Entity Framework и linq... Итак, у меня есть два класса. Класс клиента:

namespace LicenciamentoMVC.Models
{
public class Cliente
{
    [Key]
    public int IDCliente { get; set; }

    public string Nome { get; set; }
    public string Morada { get; set; }
    public string CPostal { get; set; }
    public string Localidade { get; set; }
    public string Freguesia { get; set; }
    public string Conselho { get; set; }
    public string Distrito { get; set; }
    public string Pais { get; set; }
    public string Telefone { get; set; }
    public string Telemovel { get; set; }
    public string Fax { get; set; }
    public string Email { get; set; }
    public string Nif { get; set; }
    public string WWW { get; set; }
    public string Observacoes { get; set; }
    public int IDP { get; set; }
    public int IDU { get; set; }
    public DateTime TStamp { get; set; }
    public int Rem { get; set; }
    public String TipoCliente { get; set; }

}
public class ClienteModel
{
    private static Cliente entity;
    public static IQueryable<Cliente> GetListaClientes()
    {
        MvcApplication1Context db = new MvcApplication1Context();

        var customers = from c in db.Clientes
                        orderby c.IDCliente descending
                        where c.Rem==0
                        select c;

        return customers.AsQueryable<Cliente>();
    }
  }
}

и вот мой класс Processo

  public class Processo
{
    [Key]
    public int IDProcesso { get; set; }
    public int IDCliente { get; set; }
    public DateTime DataInserido { get; set; }
    public string NumeroFactura { get; set; }
    public DateTime DataFactura { get; set; }
    public string Estado { get; set; }
    public int IDU { get; set; }
    public int Rem { get; set; }
    public DateTime TStamp { get; set; }

}

Допустим, я хочу просмотреть IDprocesso и DataInserido из класса Processo и Nome из класса Cliente.

Моя база данных состоит из двух таблиц Clientes и Processos. Мой класс dbContent:

public class MvcApplication1Context:DbContext
{
    public MvcApplication1Context()
        : base("name=MvcApplication1Context")
    {
    }

    //protected override void OnModelCreating(DbModelBuilder modelBuilder)
    //{
    //    modelBuilder.Conventions.Remove<PluralizingTableNameConvention>();
    //}
    public DbSet<Cliente> Clientes { get; set; }
    public DbSet<Processo> Processos { get; set; }
 }

Метод GetListClientes является запрашиваемым, потому что я использую компоненты Igniteui, в этом случае мы с igGrid следовали руководству, которое я нашел на сайте инфрагистики, если есть лучший способ сделать это, скажите мне.

Вернемся к теме. Я не объявлял внешние ключи из-за проблем с ограничениями. Должен ли я создать новый класс с полями, которые я хочу видеть, или есть другой способ. если я использую метод создания нового класса для отображения данных, я должен сделать что-то вроде этого внутри этого класса:

public class ProcessoClienteModel
{
    private static ProcessoCliente entity;
    public static IQueryable<ProcessoCliente> GetListaProcessos()
    {
        MvcApplication1Context db = new MvcApplication1Context();

        var processos = from p in db.Processos
                        from c in db.Clientes
                        orderby p.IDProcesso descending
                        where p.IDCliente == c.IDCliente

                        where p.Rem == 0
                        select new { p.processoID,p.DataInserido,c.Nome} as  IQueryable<ClienteModel>;
        return processos;


        return processos.AsQueryable<ProcessoCliente>();
    }

}

Или есть лучший способ сделать это... Я просматриваю темы в Интернете, пытаясь найти способ... Спасибо за помощь...

Итак, я пытался найти способ, и то, что я пытаюсь сделать, - это класс модели представления, в этой модели представления у меня будут поля, которые я хочу отобразить, идентификатор процесса, Data Inserido и имя клиента. .. и этот класс будет получать значение через linq для моего доменного класса, в данном случае процесс и клиент... Я иду в правильном направлении???

Используя совет, который дал мне Бьорн Вдкеркхове, спасибо, я сделал это. Создайте новую папку с именем viewmodel и внутри создайте новый класс с именем ProcessoCliente.cs Код этого класса:

namespace LicenciamentoMVC.ModelsView
{
public class ProcessoCliente
{
    public int IDProcesso { get; set; }
    public string NomeCliente { get; set; }
    public DateTime DataInserido { get; set; }
}
public class ProcessoModel
{
    private static ProcessoCliente entity;
    public static IQueryable<ProcessoCliente> GetListaProcessosClientes()
    {
        MvcApplication1Context db = new MvcApplication1Context();

        var processos =  (from p in db.Processos
                         join c in db.Clientes on p.IDCliente equals c.IDCliente
                          orderby p.IDProcesso descending
                         select new ProcessoCliente { IDProcesso = p.IDProcesso, NomeCliente = c.Nome, DataInserido = p.DataInserido});


        return processos.AsQueryable<ProcessoCliente>();
    }

}
}

затем я создаю представление об индексном действии контроллера Processo

@model IEnumerable<LicenciamentoMVC.ModelsView.ProcessoCliente>
@using Infragistics.Web.Mvc

@{
ViewBag.Title = "Index";
}

@* render of ignite ui grid *@
@( Html.Infragistics().Grid<LicenciamentoMVC.ModelsView.ProcessoCliente>()

    .Caption("Processos")
    .ID("grid1")
    .DefaultColumnWidth("200px")
    .PrimaryKey("IDProcesso")
    .Columns(column =>
    {

        column.For(x =>x.NomeCliente).DataType("string").HeaderText("Nome do Cliente").Width("60%");
        column.For(x => x.DataInserido).DataType("DateTine").HeaderText("Data de Criação do Processo").Width("40%");

        column.For(x => x.IDProcesso).DataType("int").Width("0%");




    })
    .Features(features =>
    {
        features.Paging().PageSize(20).PrevPageLabelText("Previous").NextPageLabelText("NEXT");
        features.Sorting().Mode(SortingMode.Single).ColumnSettings(settings =>
        {
            settings.ColumnSetting().ColumnKey("NomeCliente").AllowSorting(true);

        });
        features.Selection().MultipleSelection(false).Mode(SelectionMode.Row);
        features.Filtering().Mode(FilterMode.Simple);
        features.Updating()
               .EnableAddRow(false)
               .EnableDeleteRow(true)
               .EditMode(GridEditMode.None);




    })
    .DataSourceUrl(Url.Action("ListarProcessos"))    
    .UpdateUrl(Url.Action("DeleteProcessos"))        
   .AutofitLastColumn(false)
   .Width("100%")
    .AutoGenerateColumns(false)
    .DataBind()
    .Render()
)   

И у меня есть это действие внутри ProcessoController для загрузки сетки.

    [GridDataSourceAction]
    public ActionResult ListarProcessos()
    {
        return View(LicenciamentoMVC.ModelsView.ProcessoModel.GetListaProcessosClientes());
    }

Это работает, но я хотел бы знать, правильный ли это путь... или есть лучший способ сделать это..

Спасибо еще раз,..


person Hugo Silva    schedule 28.01.2014    source источник


Ответы (1)


У вас нет реальной связи между объектами, если я правильно вас понимаю. Все зависит от того, сколько данных вам нужно показать.

Если вы хотите показать связанные данные, вы можете сделать это в своем представлении с помощью бритвы:

@foreach(var client in Model.Clientes)
{
 <h1>@client.Name</h1>
<ul>
<li>Model.Processo.FirstOrDefault(f=> f.IDCliente == client.IDCliente).DataInserido.toString("dd-MM-yyyy")</li>
<li>.... other properties...</li>
</ul>
}
person Bjorn Vdkerckhove    schedule 29.01.2014
comment
соединение между IDCliente из процесса и IDCliente из cliente... Я не использовал внешний ключ из-за проблем с ограничениями. - person Hugo Silva; 29.01.2014
comment
Я изменил свой код на IDCliente. Таким образом, вы можете получить доступ к свойствам - person Bjorn Vdkerckhove; 29.01.2014
comment
хорошо, но теперь проблема связана с компонентом igniteui..., который получает queryable... - person Hugo Silva; 29.01.2014
comment
Если вашему компоненту требуется queryable, то да, вам нужно будет создать новый poco и вернуть новый queryable этого poco. - person Bjorn Vdkerckhove; 29.01.2014
comment
так что, если я понимаю, я должен создать модель представления, которая получает значения, которые будут отображаться в представлении??? - person Hugo Silva; 29.01.2014
comment
Если вашему компоненту пользовательского интерфейса нужен список элементов в качестве источника данных, тогда да - person Bjorn Vdkerckhove; 29.01.2014