【问题标题】:Passing a view-model to view, saving data from text-boxes into the view-model, then transferring that data from the view-model to my models将视图模型传递给视图,将文本框中的数据保存到视图模型中,然后将该数据从视图模型传输到我的模型
【发布时间】:2020-04-18 19:39:44
【问题描述】:

我不知道我是否以正确的方式进行此操作,但基本上我正在为一个俱乐部创建一个 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>

当他们选择,在他们希望参加的活动旁边注册时,它会将他们带到此操作。我创建了一个名为“MemberEventViewModel 的视图模型,其中包含一个成员和一个事件。

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


        };




        return View(Vmodel);
    }

返回的视图是成员输入其 pin 的位置


@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 的桥接表。

这也是我的视图模型类

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

    }

【问题讨论】:

  • 您好,您会包含您的 MemberEventViewModel 类及其属性吗?谢谢
  • 是的,我能做到
  • 哦,还有MemberEvents课!谢谢。澄清一下,您想在提交后保存到 MemberEvents 表吗?您是否在 SignUp Post 上获得价值?
  • 哦,MemberEvents 还没有在数据库中?你在使用代码优先吗?
  • 所以基本上我有一个带有成员集合的事件类,然后我有一个带有事件集合的成员类。我希望能够查看会员注册了哪些活动,以及哪些会员注册了特定活动。而且我能够将事件 ID 传递给 signupevent 视图,但之后我得到空值。是的,我首先使用代码

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


【解决方案1】:

看起来您的添加方式没有问题,但我认为您在添加 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);
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-02-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-13
    相关资源
    最近更新 更多