【问题标题】:How do i add two models to one view?如何将两个模型添加到一个视图?
【发布时间】:2021-08-23 09:31:12
【问题描述】:

我有两个模型,一个票证和一个叫做评论的模型。我在门票与 cmets 之间有一对多的关系。我想要做的是能够将来自我的两个模型的数据用于一个视图。我应该能够显示门票和 cmets 的数据。

如您所见,我已将我的 @model.Models.Ticket 放在 Ticket 的视图中,以便从工单到视图中获取数据。

@model WebApplication20.Models.Ticket



@{

    Layout = "_Dashboard";

    var title = "About Ticket";
}

<html>

<body id="page-top">



    <div class="card mx-auto" style="width: 18rem;">
        <div class="card-header">
            <h4><strong>Ticket Status</strong></h4> Created @Model.TicketCreated
        </div>
        <ul class="list-group list-group-flush">
            <li class="list-group-item"><strong>Name:</strong> </li>
            <li class="list-group-item"><strong>Descripton:</strong></li>
            <li class="list-group-item"><strong>Priority:</strong> @Model.TicketPriority</li>
            <li class="list-group-item"><strong>Type:</strong> @Model.TicketType</li>
            <li class="list-group-item"><strong>Status:</strong> @Model.TicketStatus</li>
        </ul>
    </div>

    <div class="card shadow mx-auto m-3" style="width: 18rem;">
        <div class="card-header">
            <h4><strong>Comments</strong></h4>
        </div>

        @*<div class="form-group row">
            <div class="col-4">
                <label asp-for=""></label>
            </div>
            <div class="col-8">
                <textarea asp-for=""  rows="5" style="resize:none;" class="form-control"></textarea>
                <span asp-validation-for="" class="text-danger"></span>
            </div>
        </div>*@
        
    </div>

我还测试过制作视图模型。

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

        public Ticket Ticket_Id { get; set; }

        public IEnumerable<SelectListItem> ProjectList { get; set; }

        public IEnumerable<SelectListItem> StatusList { get; set; }


        public string TicketStatus { get; set; }

        public DateTime TicketCreated { get; set; }

        public string TicketPriority { get; set; }
        
        public string TicketType { get; set; }
        // Comment
        public Comments Comments { get; set; }

        public Comments Comment_Id { get; set; }

        public string Message { get; set; }

    }


但问题是我需要一张独特的票才能看到正确的值。因此我在我的控制器中使用以下代码。根据我的测试,我无法通过向我的控件添加视图模型来获得视图的唯一值?

这是我希望我的视图显示票证和评论数据的控制器。

   public IActionResult Info(int id)
        {
            if (id == null)
            {
                return NotFound();
            }     

            Ticket obj = _db.Tickets.FirstOrDefault(t => t.Ticket_Id == id);

            return View(obj);
        }


【问题讨论】:

    标签: c# asp.net-mvc asp.net-core entity-framework-core


    【解决方案1】:

    只需创建一个新类来保存 Ticket 和 IEnumerable 列表。

    public class TicketWithComments
    {
    public Ticket Ticket {get;set;}
    public IEnumerable<Comment> Comments {get;set;}
    }
    

    然后在您的控制器中分配来自 Db 的值。

    TicketWithComments t=new TicketWithComments();
    t.Ticket=Ticket obj = _db.Tickets.FirstOrDefault(t => t.Ticket_Id == id);
     //I assume that there is a TicketId attribute in Comment class.
            t.Comments=_db.Comments.Where(f=>f.TicketId==id);
    return View(t);
    

    在您看来,您现在可以使用我们的新类了。

    @model TicketWithComments
    

    要到达票证的 cmets,您可以使用 foreach。

    foreach (var comment in Model.Comments)
     {
      //show comment here.
     }
    

    或者,您可以在视图中使用元组,如下所述:https://stackoverflow.com/a/13823027/1431001

    【讨论】:

      【解决方案2】:

      使用ViewBag。即ViewBag.Ticket。因此,在您的控制器中,您可以拥有

      ...
      Ticket obj = _db.Tickets.FirstOrDefault(t => t.Ticket_Id == id);
      ViewBag.Ticket = obj;
      ...
      

      那么,在视图中,你可以拥有

      Ticket obj = ViewBag.Ticket as Ticket;
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-06-01
        相关资源
        最近更新 更多