ASP .NET MVC在一个视图中有多个模型

时间:2017-03-30 12:50:14

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

我有这两个类:

public class Kolobezka : IEntity1
{
    public virtual int Id { get; set; }
    public virtual int VelikostKola { get; set; }
    public virtual string Znacka { get; set; }
    public virtual string Stav { get; set; }
    public virtual string Description { get; set; }
    public virtual Kategorie_kolobezek Kategorie { get; set; }
    public virtual int Dostupnost { get; set; }

}
public class Rezervace : IEntity1
    {
        public virtual int Id { get; set; }
        public virtual Kolobezka Rez_kolobezky { get; set; }    
        [Required(ErrorMessage = "Jméno je požadováno!")]
        public virtual string Jmeno { get; set; }   
        [Required(ErrorMessage = "Příjmení je požadováno!")]
        public virtual string Prijmeni { get; set; }  
        [Required(ErrorMessage = "Datum začátku rezervace je požadováno!")]
        public virtual DateTime Datum_od { get; set; }  
        [Required(ErrorMessage = "Datum konce rezervace je požadováno!")]
        public virtual DateTime Datum_do { get; set; }   
        public virtual string Popis { get; set; }
    }

因此,我需要在一个名为Index的视图中使用这两个分支中的两个Ilist:

@foreach (Kolobezka k in Model)
        {

            foreach (Rezervace r1 in r)
            {
                if(k.Id == r1.Rez_kolobezky.Id && r1.Datum_od < DateTime.Now && r1.Datum_do > DateTime.Now)
                {
                    k.Dostupnost = 1;
                }
            }

            if (k.Dostupnost == 0)
            {
                <tr class="bg-danger">
                    <td>
                        @Ajax.ActionLink(k.Id.ToString(), "Detail", new { id = k.Id },
                       new AjaxOptions() { UpdateTargetId = "modalContent",
                           InsertionMode = InsertionMode.Replace, OnBegin = "openModalWindow" })
                    </td>
                    <td>@k.VelikostKola</td>
                    <td>@k.Znacka</td>
                    <td>@k.Kategorie.Nazev</td>
                    <td>@k.Stav</td>
                </tr>
            }
我应该写第二个foreach而不是r。 索引视图的开头如下所示:

@using ClassLibrary1.Model
@model IList<Kolobezka>

@{
    ViewBag.Title = "Index";        
}

非常感谢你。

4 个答案:

答案 0 :(得分:0)

创建另一个类并创建每个所需类型的2个属性。

public class Compound {
    public Kolobezka foo {get; set;}
    public Rezervace bar {get; set;}
}

然后你可以将这个复合对象传递给这样的视图。

@model Compound

现在您可以访问这些对象了。如果需要,您也可以使用列表而不是单个对象。希望这有助于

答案 1 :(得分:0)

为了能够使用这两种型号,即Kolobezka和Rezervace,建议为此创建一个ViewModel,它将具有这两个类的属性。像这样的东西 - 例如 -

public class KolobezkaRezervaceViewModel
{
    public IEnumerable<Kolobezka> Kolobezkas { get; set; }
    public IEnumerable<Rezervace> Rezervaces { get; set; }
}

然后,您可以使用我们刚刚创建的View绑定您ViewModel,例如 -

@model MyWebApplication.Models.KolobezkaRezervaceViewModel

现在你可以在你的视图中使用它们 -

@foreach (Kolobezka k in Model.Kolobezkas)

...和

foreach (Rezervace r1 in Model.Rezervaces)

确保从控制器正确填充模型的值。

答案 2 :(得分:0)

为什么不创建类视图模型,并在控制器上返回对象(在视图模型上创建),并在视图中构建控制器上返回的内容。

@x.ViewModel.Name

答案 3 :(得分:-2)

我认为你不需要两种型号。下面没有使用任何HTML标记为什么你需要在视图中做。你必须在控制器中执行此操作并传递Kolobezka列表以查看

foreach (Rezervace r1 in r)
        {
            if(k.Id == r1.Rez_kolobezky.Id && r1.Datum_od < DateTime.Now && r1.Datum_do > DateTime.Now)
            {
                k.Dostupnost = 1;
            }
        }

但是如果仍然希望传递给视图的两个模型创建一个视图模型并将这些类作为属性添加到它中

public class viewmodel 
{
public Rezervace model1 { get;set;}
public Kolobezka model2 { get;set;}
}