Передача модели представления для просмотра, сохранение данных из текстовых полей в модель представления, а затем передача этих данных из модели представления в мои модели - PullRequest
1 голос
/ 18 апреля 2020

Я не знаю, правильно ли я поступаю, но в основном я создаю приложение MVC для клуба, где у меня есть класс Members и класс Events. У меня есть представление, которое отображает все события ниже

@model IEnumerable<Application.Models.Event>
@{
    Layout = null;
}

<h1>Events For this Month!</h1>
<table>


    @foreach (var events in Model)

    {

        <tr>
            <td><h2>@events.Name</h2></td>

            <td>
                @Html.ActionLink("Sign-Up", "SignUpEvent", "User", new { id = events.Id }, null)
            </td>
        </tr>


    }

</table>

, когда они выбирают, зарегистрируйтесь рядом с событием, которое они будут посещать sh, оно приведет их к этому действию. Я создал модель представления с именем "MemberEventViewModel, в которой есть член и событие в нем.

    public ActionResult SignUpEvent(int id)
    {
        var Vmodel = new MemberEventViewModel() 
        {


        };




        return View(Vmodel);
    }

возвращаемое представление - это когда член вводит свой пин-код


@model Application.ViewModels.MemberEventViewModel
@{
    Layout = null;
}


<h2>Sign-Up</h2>

@using (Html.BeginForm("SignUp", "User")) 
{
    @Html.LabelFor(c => c.Member.PIN)
    @Html.TextBoxFor(c => c.Member.PIN)


    @Html.HiddenFor(c => c.Events.Id)

    <button type="submit">Save</button>
}

, а затем, наконец, переходит к этот контроллер, чтобы я мог сохранить и увидеть событие, на которое подписался участник на

    [HttpPost]
    public ActionResult SignUp(MemberEventViewModel Vmodel) 
    {

        var EventinDB = _context.Events.SingleOrDefault(c => c.Id == Vmodel.Events.Id);
        var MemberinDB = _context.Members.SingleOrDefault(c => c.PIN == Vmodel.Member.PIN);
        MemberinDB.Events.Add(EventinDB);
        EventinDB.Members.Add(MemberinDB);


        return View("ViewEvents", "User");

Я не понимаю, как это работает. Я хочу посмотреть, на какие события подписан участник, и наоборот. Таблица мостов, названная MemberEvents, была создана, когда я создал отношение «многие ко многим» между Событиями и Участниками.

также здесь представлен мой класс модели View

    public class MemberEventViewModel
    {
        public Member Member { get; set; }
        public Event Events { get; set; }


    }

здесь приведены события класс

    public class Event
    {

        public int Id { get; set; }
        [Required]
        public string Name { get; set; }
        [Required]
        [Display(Name = "Date")]
        public DateTime? EventDate { get; set; }
        [Required]
        [Display(Name = "Start Time")]
        public TimeSpan EventStartTime { get; set; }
        [Required]
        [Display(Name = "End Time")]
        public TimeSpan EventEndTime { get; set; }
        public int EventTotalTime{ get; set; }
        public virtual ICollection<Member> Members { get; set; }


    }

и члены класса


    public class Member
    {
        public int Id { get; set; }
        [Required]
        [MaxLength(4, ErrorMessage = "PIN must be 4 numbers long"), MinLength(4, ErrorMessage = "PIN must be 4 numbers long")]
        public string PIN { get; set; }
        [Required]
        [Display(Name ="First Name")]
        public string FirstName { get; set; }
        [Required]
        [Display(Name = "Last Name")]
        public string LastName { get; set; }
        [Display(Name = "Date of Birth")]
        public DateTime? Birthdate { get; set; }
        public virtual ICollection<Event> Events { get; set; }

    }

1 Ответ

0 голосов
/ 18 апреля 2020

Похоже, нет ничего плохого в том, как вы добавляете его, но я думаю, что вы пропустили context.SaveChanges() после добавления объекта MemberEvents.

[HttpPost]
public ActionResult SignUp(MemberEventViewModel Vmodel) 
{
   var EventinDB = _context.Events.SingleOrDefault(c => c.Id == Vmodel.Events.Id);
   var MemberinDB = _context.Members.SingleOrDefault(c => c.PIN == Vmodel.Member.PIN);

   // try using one only
   MemberinDB.Events.Add(EventinDB);
   // EventinDB.Members.Add(MemberinDB);

   // you should save here   
   _context.SaveChanges();

   return View("ViewEvents", "User");
}

Также убедитесь, что вы назначаете свойства здесь;

public ActionResult SignUpEvent(int id)
{
   var Vmodel = new MemberEventViewModel() 
   {
      Member = // find the member _context.Members.Where(...)
      Events = _context.Events.FirstOrDefault(e=>e.Id == id)
   };
   return View(Vmodel);
}
...