【问题标题】:How to pass 2 lists to 1 view如何将 2 个列表传递给 1 个视图
【发布时间】:2014-05-03 12:22:58
【问题描述】:

我想在我的视图(一页)中显示最近和即将到来的约会。这是我的控制器,我可以在哪里添加第二个列表以及如何将它传递到同一个视图?我知道我不能返回两个列表,但必须有有办法吗?

public ActionResult Index()
        {
            if (Session["UserEmail"] != null) 
            {
                string Email = (string)Session["UserEmail"];

                using (var db = new MaindbModelDataContext())
                {
                    var patient = db.Patients.FirstOrDefault(u => u.Email == (String)Session["UserEmail"]);
                    ViewBag.FirstName = patient.Name;
                    ViewBag.LastName = patient.Surname;
                    ViewBag.BirthDate = patient.Birthday;
                    ViewBag.Email = patient.Email;


                }


                using (var db = new MaindbModelDataContext())
                {
                    var patient = db.Patients.FirstOrDefault(u => u.Email == (String)Session["UserEmail"]);
                    var listrecent = (from y in db.Appointments
                                      where y.PatientNo == patient.PatientNo
                                      where y.Date < DateTime.Today
                                      orderby y.Date descending
                                      select y).Take(5); 

                    var TempRecent = new List<Models.AppModel>();
                    foreach (var item in listrecent)
                    {
                        var Temp = new Models.AppModel();
                        Temp.AppNo = item.AppNo;
                        Temp.PatientNo = (Int32)item.PatientNo;
                        Temp.Date = (DateTime)item.Date;
                        Temp.Status = item.Status;
                        Temp.Description = item.Description;
                        TempRecent.Add(Temp);

                    }
                    return View(TempRecent);
                }

            }
            else
            {
                return RedirectToAction("RegAndLogin", "User");
            }
        }

    }
}

这是我的观点

@model IEnumerable<DentAppSys.Models.AppModel>
@using System.Web.Helpers

@{
    ViewBag.Title = "Index";
}


    <section class="Patient-Dashboard">

        <div id="dashboard_left">
            <h1> Recent Appointments</h1>
   @{
    var Mygrid = new WebGrid(Model, selectionFieldName: "SelectedRow");
}

@Mygrid.GetHtml(
    displayHeader: true,

    mode: WebGridPagerModes.FirstLast,

columns: Mygrid.Columns
(

    Mygrid.Column("Appointment No", "Appointment No",format: @<text>@item.AppNo</text>),
    Mygrid.Column("Patient No", "Patient No", format: @<text>@item.PatientNo</text>) ,
    Mygrid.Column("Description", "Description", format: @<text>@item.Description</text>),
    Mygrid.Column("Date", "Date", format: @<text>@item.Date.ToString("yyyy/MM/dd")</text>),
    Mygrid.Column("Status", "Status", format: @<text>@item.Status</text>)

))
</div>

<div id="dashboard_right">
<br/>
<h1>Incoming Appointments</h1>

  /* HERE I WANT TO ADD MY SECOND LIST*/
</div>
</section>

编辑:

在使用 AppModel 的两个实例后,当我尝试等于 Temp.RecentIncoming.AppNo=item.AppNo. 时出现错误。

using (var db = new MaindbModelDataContext())
                {
                    var patient = db.Patients.FirstOrDefault(u => u.Email == (String)Session["UserEmail"]);
                    var listincoming = (from y in db.Appointments
                                      where y.PatientNo == patient.PatientNo
                                      where y.Date > DateTime.Today
                                      orderby y.Date descending
                                      select y).Take(5);

                    var TempIncoming = new List<Models.RecentIncoming>();
                    foreach (var item in listincoming)
                    {
                        var Temp = new Models.RecentIncoming.;
                        Temp.RecentIncoming.AppNo?????= item.AppNo;
                        Temp.PatientNo = (Int32)item.PatientNo;
                        Temp.Date = (DateTime)item.Date;
                        Temp.Status = item.Status;
                        Temp.Description = item.Description;
                        TempIncoming.Add(Temp);

                    }
                    return View(TempIncoming);
                }

【问题讨论】:

    标签: list asp.net-mvc-4 view controller webgrid


    【解决方案1】:

    不要将 IEnumerable 作为您的模型,而是创建一个新模型类,其中包含 AppModel 的两个实例以及您需要传递给视图的任何其他附加数据...

    public class MyAppointments
    {
       public IEnumerable<DentAppSys.Models.AppModel> RecentAppts;
       public IEnumerable<DentAppSys.Models.AppModel> IncomingAppts;
       public MyAppointments() { }
    }
    ...
    return View( new MyAppointments() {  RecentAppts=TempRecent, IncomingAppts=TempIncoming       } );
    

    将视图更改为...

        @model MyAppointments
        ...
       @{
        var MyRecentgrid = new WebGrid(Model.RecentAppts, selectionFieldName: "SelectedRow");
        var MyIncomingGrid = new WebGrid(Model.IncomingAppts, selectionFieldName: "SelectedRow");
        }
    

    【讨论】:

    • 感谢您的回答。我在这部分出现错误 new RecentIncoming() 。错误是“预期的类、委托、枚举、接口或结构”...
    • 在上面的代码中,假设您最近的应用程序和传入的应用程序都是 Models.AppModel 的 IEnumerable。因此,如果出现错误,请创建另一个 Models.AppNo,而不是 Models.RecentIncoming。 RecentIncoming 不是一个类,它是视图模型中的一个变量,它包含最近应用的 IEnumerable。此外,您将其传递给一个视图,我认为它是相同的视图。如果您想使用相同的视图来显示最近的和传入的,则创建一个 MyAppointments 实例(您需要使用代码创建的类,如图所示)....
    • (续)然后为最近的和传入的创建 IEnumerable 值,并将它们分配给 MyAppointment 实例。将您的 razor 视图模型更改为 MyAppointments,然后访问传入值和最近值的单独变量。基本上,要将多个值传递给一个视图,您需要创建一个容器模型来保存它们,您不能将多个值传递给一个视图(除了使用 ViewBag 或 TempData,这不建议用于此解决方案)。
    猜你喜欢
    • 1970-01-01
    • 2011-12-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-03-11
    • 1970-01-01
    • 2022-07-08
    • 1970-01-01
    相关资源
    最近更新 更多