将视图模型传递给视图,将文本框中的数据保存到视图模型中,然后将数据从视图模型转移到我的模型中

时间:2020-04-18 19:39:44

标签: c# asp.net-mvc entity-framework model-view-controller ef-code-first

我不知道我是否要采用正确的方法,但是基本上我是在为拥有会员类和活动类的俱乐部创建MVC应用程序。我有一个视图,显示以下所有事件

@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>

选择后,在希望参加的活动旁边注册即可将他们带到此操作。我创建了一个名为“ 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 :(得分:0)

添加方式似乎没有什么问题,但我认为添加MemberEvents对象后错过了context.SaveChanges()

[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);
}