【问题标题】:Model is not binding to ViewModel ASP.Net MVC模型未绑定到 ViewModel ASP.Net MVC
【发布时间】:2020-03-06 15:41:22
【问题描述】:

在我的控制器的 GET 编辑功能中,我将 id 作为参数并找到正确的模型。一切都按应有的方式填充。 我想转身从这个模型生成一个 ViewModel,这样我就可以向它添加更多字段,但是一旦我用已经填充的模型创建了一个 ViewModel 的实例,一切都保持为空。

public ActionResult Edit(int? id)
    {
        var context = new PrincipalContext(ContextType.Domain);
        var un = UserPrincipal.FindByIdentity(context, User.Identity.Name);
        if (id == null)
        {
            return new HttpStatusCodeResult(HttpStatusCode.BadRequest);
        }

        Ticket ticket = db.Tickets.Find(id);

        var ticketViewModel = new TicketViewModel(ticket);

        if (ticket == null)
        {
            return HttpNotFound();
        }
        List<TicketViewModel> TVM = new List<TicketViewModel>();
        var tl = (from TU in db.Users
                    where TU.sAMAccountName == un.SamAccountName
                    join UD in db.Departments on TU.DepartmentID equals UD.Id
                    select new
                    {
                        TU.Id,
                        TU.sAMAccountName,
                        UD.Name,
                        TU.DepartmentID
                    }).ToList();
        foreach(var listitem in tl)
        {

            ticketViewModel.UserID = listitem.Id;
            //ticketViewModel.DepartmentName = listitem.Name;
            //ticketViewModel.sAMAccountName = listitem.sAMAccountName;
            ticketViewModel.DepartmentID = listitem.DepartmentID;

        }
        ViewBag.CategoryID = new SelectList(db.Categories, "Id", "CategoryName");
        ViewBag.UserID = new SelectList(db.Users, "Id", "CanonicalName", ticket.UserID);
        return View(ticketViewModel);
    }

TicketViewModel

public class TicketViewModel
{
    public Ticket Ticket { get; set; }

    [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA2214:DoNotCallOverridableMethodsInConstructors")]
    public TicketViewModel(Ticket ticket)
    {
        this.NoteHistories = new HashSet<NoteHistory>();

        Ticket = ticket;
    }   
    public int Id { get; set; }
    public string Title { get; set; }
    public int CategoryID { get; set; }
    public string Subcategory { get; set; }
    public string Severity { get; set; }
    public int UserID { get; set; }
    public int DepartmentID { get; set; }
    public string DepartmentName { get; set; }
    public string sAMAccountName { get; set; }
    public string Application { get; set; }
    public int WorkstationID { get; set; }
    public string Notes { get; set; }
    public string Description { get; set; }
    public System.DateTime Created_At { get; set; }
    public System.DateTime Updated_At { get; set; }
    public virtual Category Category { get; set; }
    public virtual Department Department { get; set; }
    public virtual User User { get; set; }
    [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA2227:CollectionPropertiesShouldBeReadOnly")]
    public virtual ICollection<NoteHistory> NoteHistories { get; set; }

}

票证模型

新的 TicketViewModel(ticket) 之后的ticketViewModel

【问题讨论】:

  • 他们是两个不同的模型?您在TicketViewModel 中设置Ticket
  • 你有点错过了观点模型。您通常不会将实体嵌入其中 - 使用类似 automapper 的东西。此外,您不需要 ViewBag - 也将这些选择列表添加到您的视图模型中。
  • 我认为viewmodels的观点是将几个不同的模型组合成一个,然后只返回一个?上下文,这是我第一个体面的 ASP(不是 MVC)项目,我正在学习。我正计划将 ViewBag 中的其他项目添加到 ViewModel,但我想先让它工作。
  • “一切都是空的”是什么意思?您向构造函数发送了一个代理到 Ticket 对象,这就是它所具有的。你应该考虑不这样做。您的 VM 将具有与您的模型匹配的字段,并且您将使用自动映射器或手动代码来设置这些字段。

标签: c# asp.net asp.net-mvc viewmodel


【解决方案1】:

当然它仍然是空的。您只需要在 TicketViewModel 类中设置三个变量。

在这里,您正在创建TicketViewModel 的新实例并将TicketModel 作为参数传递给构造函数:

var ticketViewModel = new TicketViewModel(ticket);

在构造函数中设置Ticket 变量:

Ticket = ticket;

您在此处设置IdNameaAMAccountNameDepartmentID

        ticketViewModel.UserID = listitem.Id;
        //ticketViewModel.DepartmentName = listitem.Name;
        //ticketViewModel.sAMAccountName = listitem.sAMAccountName;
        ticketViewModel.DepartmentID = listitem.DepartmentID;

就是这样。您没有设置任何其他内容。

但我确实注意到上面的内容在 foreach 中,所以如果列表中有多个项目,它们将被覆盖。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-07-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多