Модель не привязана к ViewModel ASP. Net MVC - PullRequest
0 голосов
/ 06 марта 2020

В функции GET edit моего контроллера я беру идентификатор в качестве параметра и нахожу правильную модель. Все населено как надо. Я хочу развернуться и сгенерировать 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; }

}

Модель билета

enter image description here

ticketViewModel после новой TicketViewModel (тикета) enter image description here

1 Ответ

0 голосов
/ 06 марта 2020

Конечно, все равно будет ноль. Вы устанавливаете только три переменные в классе TicketViewModel.

Здесь вы создаете новый экземпляр TicketViewModel и передаете TicketModel в качестве параметра конструктору:

var ticketViewModel = new TicketViewModel(ticket);

В конструкторе вы устанавливаете переменную Ticket:

Ticket = ticket;

Здесь вы устанавливаете Id, Name, aAMAccountName и DepartmentID

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

и все. Вы не устанавливаете ничего другого.

Я заметил, однако, что выше указано в foreach, поэтому, если в списке более одного элемента, они будут перезаписаны.

...