【问题标题】:ViewModel Mvc Display detailsViewModel Mvc 显示细节
【发布时间】:2016-03-13 11:24:37
【问题描述】:

所以我有 3 个模型,需要在 3 个模型上的视图中显示信息,所以我创建了一个 viewModel,其中包含视图所需的信息

模型 1:

public class Despesa
{
    public int TipoDespesaId { get; set; }

    public int DespesaId { get; set; }

    [Display(Name = "Descrição da Despesa")]
    [Required]
    public string DespesaDescricao { get; set; }

    [Display(Name = "Valor")]
    [Required]
    public decimal DespesaValor { get; set; }

    public int TipoPagamentoId { get; set; }

    [Display(Name = "Data")]
    [DataType(DataType.Date)]
    [DisplayFormat(DataFormatString = "{0:yyyy-MM-dd}",ApplyFormatInEditMode = true)]
    [Required]
    public DateTime Data { get; set; }

    public TipoDespesa TipoDespesa { get; set; }

    public TipoPagamento TipoPagamento { get; set; }

    [Display(Name = "Comentário")]
    public string Comentario { get; set; }

}

模型2:

 public class TipoDespesa
{
    public int TipoDespesaId { get; set; }
    [Display(Name = "Tipo de Despesa")]
    [Required]
    public string TipoDespesaNome { get; set; }
}

模型3:

 public class TipoPagamento
{
    public int TipoPagamentoId { get; set; }
    [Display(Name = "Tipo de Pagamento")]
    [Required]
    public string TipoPagamentoNome { get; set; }
}

我的视图模型:

 public class ViewModelDetalhes
{
    public string TipoDespesa { get; set; }
    public string TipoPagamento { get; set; }
    public string Descricao { get; set; }
    public decimal Valor { get; set; }
    public DateTime Data { get; set; }
    public string comentario { get; set; }


}

我的详细信息:

public ActionResult Details(int? id)
    {
        var modelo = db.Despesas.Where(p => p.DespesaId == id).FirstOrDefault();
        if (id == null)
        {
            return new HttpStatusCodeResult(HttpStatusCode.BadRequest);
        }

        if (modelo == null)
        {
            return HttpNotFound();
        }
        ViewModelDetalhes model = new ViewModelDetalhes()
        {
            TipoDespesa = modelo.TipoDespesa,
            TipoPagamento = modelo.TipoPagamento,
            Descricao = modelo.DespesaDescricao,
            Valor = modelo.DespesaValor,
            comentario = modelo.Comentario,

        };
        return View(model);
    }

我不知道如何在这里获取 TipoPagamento 和 TipoDespesa 的值,我应该在模型上做一个包含吗?我有点困惑,需要知道如何检索与主类 Despesas 关联的值 TipoPagamento 和 TipoDespesa。 谢谢

【问题讨论】:

    标签: asp.net-mvc


    【解决方案1】:

    你的视图模型

    public class ViewModelDetalhes
    {
        public string TipoDespesa{ get; set; }
        public string TipoPagamento { get; set; }
        public string Descricao { get; set; }
        public decimal Valor { get; set; }
        public DateTime Data { get; set; }
        public string comentario { get; set; }
    
    
    }
    

    如果你想延迟加载,请使用 Virtual

    public class Despesa
    {
        public int TipoDespesaId { get; set; }
    
        public int DespesaId { get; set; }
    
        [Display(Name = "Descrição da Despesa")]
        [Required]
        public string DespesaDescricao { get; set; }
    
        [Display(Name = "Valor")]
        [Required]
        public decimal DespesaValor { get; set; }
    
        public int TipoPagamentoId { get; set; }
    
        [Display(Name = "Data")]
        [DataType(DataType.Date)]
        [DisplayFormat(DataFormatString = "{0:yyyy-MM-dd}",ApplyFormatInEditMode = true)]
        [Required]
        public DateTime Data { get; set; }
    
        public virtual TipoDespesa TipoDespesa { get; set; }
    
        public virtual TipoPagamento TipoPagamento { get; set; }
    
        [Display(Name = "Comentário")]
        public string Comentario { get; set; }
    
    }
    

    你详细说明 ActionResult

    public ActionResult Details(int? id)
        {
            var modelo = db.Despesas.Where(p => p.DespesaId == id).FirstOrDefault();
            if (id == null)
            {
                return new HttpStatusCodeResult(HttpStatusCode.BadRequest);
            }
    
            if (modelo == null)
            {
                return HttpNotFound();
            }
            ViewModelDetalhes model = new ViewModelDetalhes()
            {
                TipoDespesa = modelo.TipoDespesa.TipoDespesaNome ,
                TipoPagamento = modelo.TipoPagamento.TipoPagamentoNome,
                Descricao = modelo.DespesaDescricao,
                Valor = modelo.DespesaValor,
                comentario = modelo.Comentario,
    
            };
            return View(model);
        }
    

    如果您不想急切加载,请使用包含。无需将虚拟添加到您的 POCO。

    在您的详细操作结果中

     public ActionResult Details(int? id)
            {
                var modelo = db.Despesas.Include("TipoDespesa").Include("TipoPagamento").Where(p => p.DespesaId == id).FirstOrDefault();
                if (id == null)
                {
                    return new HttpStatusCodeResult(HttpStatusCode.BadRequest);
                }
    
                if (modelo == null)
                {
                    return HttpNotFound();
                }
                ViewModelDetalhes model = new ViewModelDetalhes()
                {
                    TipoDespesa = modelo.TipoDespesa.TipoDespesaNome ,
                    TipoPagamento = modelo.TipoPagamento.TipoPagamentoNome,
                    Descricao = modelo.DespesaDescricao,
                    Valor = modelo.DespesaValor,
                    comentario = modelo.Comentario,
    
                };
                return View(model);
            }
    

    在此处阅读更多信息:https://msdn.microsoft.com/en-gb/data/jj574232.aspx

    【讨论】:

    • 一些问题,在这种情况下,虚拟是为了什么??,我明白没有包含我怎么能做同样的事情,我想如果我创建了我不需要使用的模型视图包含:S
    • 包含工作,但是如果我们可以使用包含做所有事情,为什么还要使用视图模型:S
    • Include 关键字告诉 EF 加载您的相关实体。如果您对该属性使用了 Virtual,则无需在 Linq 查询中使用 Include。另一方面,ViewModel 只是一个指定要在视图中显示的内容的类。在您的情况下,您不需要 viewModel,您可以使用您的 Despesas 模型。但是通过使用 viewModel,您只选择了您希望在视图中显示的属性。在带宽、安全性、处理等方面没有额外的属性是件好事……作为一个好习惯,我总是使用 viewModel
    • ViewModel 不能替代 Include。它们是完全不同的东西。
    • Soo 基本上 ViewModel 可以使代码更简洁,对吗?因为在我的情况下,正如你所说我不需要 viewModel 我可以只包含我需要的类并使用 atirbutes,是使用虚拟一个好的做法??
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多