Связь Многие-ко-многим, передача данных в контроллер и представление ASP.NET MVC

401
26 апреля 2017, 08:52

Здравствуйте.

Есть 2 таблицы SepticTank и Discount. Как передать все данные в контроллер и представление при связи многие-ко-многим, если на некоторых моделях есть скидка, а на других нет?

вот пример кода:

Модель SepticTank.cs

public class SepticTank
{
    [Display(Name = "Наименование модели")]
    public int Id { get; set; }
    [Display(Name = "Модель")]
    public string Model { get; set; }
    [Range(0, 20000000, ErrorMessage = "Недопустимая цена")]
    [Display(Name = "1 компрессор")]
    public int Cost1Comp { get; set; }    //Цена с 1 компрессором
    [Range(0, 20000000, ErrorMessage = "Недопустимая цена")]
    [Display(Name = "2 компресора")]
    public int Cost2Comp { get; set; }    //Цена с 2 компрессорами
    [Range(1, 1000, ErrorMessage = "Недопустимое количество пользователей")]
    [Display(Name = "Количество пользователей")]
    public int CountUsers { get; set; }
    [Range(0, 500, ErrorMessage = "Недопустимый дневной приток")]
    [Display(Name = "Максимальный дневной приток")]
    public double InflowDrain { get; set; }  //Максимальный дневной приток
    [Range(0, 300, ErrorMessage = "Недопустимая число использования электроэнергии")]
    [Display(Name = "Энергия")]
    public double Energy { get; set; }
    [Range(1, 200, ErrorMessage = "Недопустимая длина")]
    [Display(Name = "Длина")]
    public double Lenght { get; set; }
    [Range(1, 200, ErrorMessage = "Недопустимая ширина")]
    [Display(Name = "Ширина")]
    public double Weight { get; set; }
    [Range(1, 200, ErrorMessage = "Недопустимая высота")]
    [Display(Name = "Высота")]
    public double Height { get; set; }
    public virtual ICollection<Discount> Discounts { get; set; }
    public SepticTank()
    {
        Discounts = new List<Discount>();
    }

Модель Discount.cs:

public class Discount
{
    public int Id { get; set; }
    [Display(Name = "Дата начала акции")]
    public DateTime DateBegin { get; set; }
    [Display(Name = "Дата окончания акции")]
    public DateTime DateEnd { get; set; }
    [Range(0, 100, ErrorMessage = "Недопустимый процент")]
    [Display(Name = "Процент скидки")]
    public int Percent { get; set; }
    public virtual ICollection<SepticTank> SepticTanks { get; set; }
    public Discount()
    {
        SepticTanks = new List<SepticTank>();
    }
}

Модель SepticTankContext.cs

 public class SepticTankContext : DbContext
{
    public SepticTankContext() : base("DefaultConnection")
    { }
    public DbSet<SepticTank> SepticTanks { get; set; }
    public DbSet<Discount> Discounts { get; set; }
    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        modelBuilder.Entity<Discount>().HasMany(c => c.SepticTanks)
            .WithMany(s => s.Discounts)
            .Map(t => t.MapLeftKey("DiscountId")
            .MapRightKey("SepticTankId")
            .ToTable("DiscountSepticTank"));
    }
}

UPD:

В проекте можно вывести все данные, но на странице будут показываться только те записи из первой таблицы, которые уже связаны со второй

вот пример действия в контроллере

public ActionResult Models()
    {
        SepticTank Sept = db.SepticTanks.Find();
        ViewBag.Discounts = db.Discounts.ToList();
        return View(Sept);
    }

а также вот примерное представление Models.cshtml

@using ProjectTopas_v_1._2.Models 
@model SepticTank 
@{ 
    ViewBag.Title = "Модельный ряд"; 
    Layout = "~/Views/Shared/_Layout.cshtml"; 
} 
 
<div class="row"> 
     
    <table class="table table-bordered table-hover"> 
        <thead> 
            <tr> 
                <th rowspan="2">Модель</th> 
                <th colspan="2" style="text-align:center"><p>Цена, руб.</p></th> 
                <th rowspan="2">Количество <br />пользователей, чел.</th> 
                <th rowspan="2">Максимально дневной<br /> приток, м<sup>3</sup>/сутки</th> 
                <th rowspan="2">Энергия,<br />Квт/сутки</th> 
                <th colspan="3" style="text-align:center">Габаритные размеры</th> 
            </tr> 
            <tr> 
                <th>1 компрессор</th> 
                <th>2 компрессора</th> 
                <th>Длина, м</th> 
                <th>Ширина, м</th> 
                <th>Высота, м</th> 
            </tr> 
        </thead> 
        <tbody> 
            @foreach (var b in Model.Discounts) 
            { 
                <tr> 
                    <td style="text-align:center"><a href="/Home/Details/@Model.Id">@Model.Model</a></td> 
                    <td style="text-align:center"> 
                        <p> 
            @if (Model.Cost1Comp == 0) 
            { } 
            else 
            { 
                double d = Math.Round(Model.Cost1Comp * (1 - ((double)b.Percent / 100))); 
                <small><s style="color:gray">@Html.DisplayFor(model => model.Cost1Comp)</s></small> 
                      <p style="color:red">@d (-@b.Percent %)</p> 
    } 
                         
                    </td> 
                    <td style="text-align:center"> 
                        <p> 
            @if (Model.Cost2Comp == 0) 
            { } 
            else 
            { 
                double d = Math.Round(Model.Cost2Comp * (1 - ((double)b.Percent / 100))); 
                <small><s style="color:gray">@Html.DisplayFor(model => model.Cost2Comp)</s></small> 
                     <p style="color:red">@d (-@b.Percent %)</p> 
                  } 
                    </td> 
                    <td style="text-align:center"><p>@Model.CountUsers</p></td> 
                    <td style="text-align:center"><p>@Model.InflowDrain</p></td> 
                    <td style="text-align:center"><p>@Model.Energy</p></td> 
                    <td style="text-align:center"><p>@Model.Lenght</p></td> 
                    <td style="text-align:center"><p>@Model.Weight</p></td> 
                    <td style="text-align:center"><p>@Model.Height</p></td> 
                </tr> 
            } 
        </tbody> 
    </table> 
    <br /> 
</div>

READ ALSO
Запуск приложения использующего localdb на разных компьютерах

Запуск приложения использующего localdb на разных компьютерах

Я написал приложение на языке C#, которое работает с базой данных MS SQLЕсли я переношу приложение на другой компьютер и пытаюсь запустить то оно...

331
Windows Forms application with ball walking randomly

Windows Forms application with ball walking randomly

Не могли бы вы,пожалуйста,создать корректно эту программу(по-своему,скорее всего,потому что я еще зеленый и пишу лапшу), чтобы я смог сравнить...

242
(Unity) Проект несовместим с текущим выпуском Visual Studio 2017

(Unity) Проект несовместим с текущим выпуском Visual Studio 2017

Перестал открываться проект Unity/С#, после установки поддержки C++ проектов(До этого все работало) Решение вроде открывается, в самом проекте...

360
Убегающий ScrollBar на flowLayoutPanel

Убегающий ScrollBar на flowLayoutPanel

На форме(Windows Forms) есть flowLayoutPanel в который динамически добавляются разные элементыAutoScroll = true

774