使用另一个视图模型从视图中的一个模型创建记录

Create record from one model in view with another view model

我有 httpost 激活方法,它应该将用户记录(来自轮询用户选项模型)存储在数据库中。为用户激活方法显示弹出窗口,他选择其中一个选项并提交。该方法的目的是通过 Poll 视图模型从 Poll 用户选项模型创建记录。

[HttpPost]
        public ActionResult Activate(PollOptionsVM pum)
        {

            User user = UserService.GetCurrent();

            if (ModelState.IsValid)
            {
                Poll_User_Options model = new Poll_User_Options()
                {
                    poll_id = pum.PollID,
                    user_id = user.ID,
                    option_id = pum.OptionID

                };
                PollUserOptionsService.Create(model); //model
                //return RedirectToAction("Index1");
            }


            return View();
        }

并从轮询视图模型激活视图。模型状态无效并且不会始终创建记录,因为视图中的 pum.PollID 和 pum.OptionID returns 0。如何在用户提交凭据时创建记录

@model test.ViewModels.PollVM

@if (ViewBag.ViewPopup)
{
    <div id="PollModal" class="modal fade" role="dialog">
        <div class="modal-dialog">

            <!-- Modal content-->
            <div class="modal-content">
                <div class="modal-header">
                    <button type="button" class="close" data-dismiss="modal">&times;</button>
                    <h4 class="modal-title">Modal Header</h4>
                </div>
                <div class="modal-body">

                    @using (Html.BeginForm("Activate", "Poll", FormMethod.Post))
                {
                        <h2>Index</h2>
                        <div class="container">
                            @Html.HiddenFor(m => m.PollID)
                            <div class="form-group row">
                                <label for="polltitle" class="col-lg-2 col-md-2 col-sm-12 col-xs-12 col-form-label col-lg-offset-1 col-md-offset-1">
                                    @Html.DisplayNameFor(m => m.Title)
                                    <span class="text-danger">*</span>
                                </label>
                                <div class="col-lg-7 col-md-7 col-sm-12 col-xs-12">
                                    @Html.TextBoxFor(m => m.Title, new { @id = "QuestionTextBody", @class = "form-control ckeditor", disabled = "disabled" })
                                    @Html.ValidationMessageFor(m => m.Title, null, new { @class = "text-danger" })
                                </div>
                            </div>


                            <div class="form-group row">
                                <table id="myTable" class="order-list">
                                    <thead>
                                        @foreach (var item in Model.PollOptionList)
                                        {
                                            <tr>
                                                <td class="col-sm-7">
                                                    @Html.TextBox("OptionTitle", item.Title, new { placeholder = "Enter text here", @class = "form-control", disabled = "disabled" })
                                                    @Html.RadioButton("OptionTitle", item.OptionID, new { @class = "custom-control-input"})
                                                </td>
                                            </tr>
                                        }
                                    </thead>
                                    <tbody></tbody>

                                </table>
                            </div>



                            @*<button href="/Poll/Answer" type="submit" value="Submit">Save</button>*@
                            <button  type="submit" value="Submit">Save</button>
                            
                        </div>
                    }
                </div>
                <div class="modal-footer">
                    <button type="button" class="btn btn-default" data-dismiss="modal">Close</button>
                </div>
            </div>

        </div>
    </div>
}

这是我的 PollVM

public class PollVM
    {
        public int PollID { get; set; }

        [Display(Name = "Type")]
        [Required]
        public int Type { get; set; }

        [Display(Name = "Status")]
        [Required]
        public int Status { get; set; }

        [Display(Name = "Title")]
        [Required]
        public string Title { get; set; }

        public DateTime? DateCreated { get; set; }
        public DateTime? DateEdited { get; set; }

        public List<PollOptionsVM> PollOptionList { get; set; }

        public List<PollUserOptionsVM> PollUserOptionsList { get; set; } //added

        public int IsSelected { get; set; } //added

        public Poll ToModel(PollVM vm)
        {
            Poll model = new Poll();

            model.id = vm.PollID;//added
            model.type = vm.Type;
            model.status = vm.Status;
            model.title = vm.Title;
            model.date_created = DateTime.Now;
            model.date_edited = model.date_created; 

            if (vm.PollOptionList != null)
            {
                foreach(var item in vm.PollOptionList)
                {
                    var option = new Poll_Options();
                    option.title = item.Title;
                    option.date_created = DateTime.Now;
                    option.date_edited = DateTime.Now;
                    model.Poll_Options.Add(option);
                }
            }

            return model;
        }

        public Poll ToEditModel(PollVM vm, Poll model)
        {
            model.type = vm.Type;
            model.status = vm.Status;
            model.title = vm.Title;
            model.date_created = DateTime.Now;
            model.date_edited = DateTime.Now;

            if(vm.PollOptionList != null)
            {
                foreach (var item in vm.PollOptionList)
                {
                    var option = new Poll_Options();
                    option.title = item.Title;
                    option.date_created = DateTime.Now;
                    option.date_edited = DateTime.Now;
                    model.Poll_Options.Add(option);

                }
            }

            return model;
        }

        public PollVM ToViewModel(Poll model)
        {
            PollVM ViewModel = new PollVM()
            {
                PollID = model.id,
                Type = model.type,
                Status = model.status,
                Title = model.title,
                DateCreated = model.date_created,
                DateEdited = model.date_edited,
                PollOptionList = new List<PollOptionsVM>()
            };

            if (model.Poll_Options.Count != 0)
            {
                foreach (var option in model.Poll_Options)
                {
                    var optionVM = new PollOptionsVM();
                    optionVM.OptionID = option.id;
                    optionVM.PollID = option.poll_id;
                    optionVM.Title = option.title;
                    optionVM.DateCreated = DateTime.Now;
                    optionVM.DateEdited = DateTime.Now;

                    ViewModel.PollOptionList.Add(optionVM);
                }
            }

            return ViewModel;
        }

        public List<PollVM> ToViewModelList(List<Poll> polls)
        {
            List<PollVM> pollList = new List<PollVM>();
            foreach(var item in polls)
            {
                pollList.Add(ToViewModel(item));
            }

            return pollList;
        }


    }

获取激活方法

 public ActionResult Activate()
        {
            PollVM vm = new PollVM();

            Poll poll = PollService.GetPollByStatusActive();
            PollVM pvm = new PollVM();

            bool b = false;

            if (poll != null)
            {
                pvm = vm.ToViewModel(poll);
                b = true;
            }

            ViewBag.ViewPopup = b;

            return PartialView(pvm);
           
        }

我稍微修改了你的代码。按着这些次序。这段代码对我有用。 用自己的数据替换SetPoll()方法

将视图更改为此

@foreach (var item in Model.PollOptionList)
{
     <tr>
        <td class="col-sm-7">
           @Html.TextBox("OptionTitle", item.Title, new { placeholder = "Enter text here", @class = "form-control", disabled = "disabled" })
           @Html.RadioButton("OptionID", item.OptionID, new { @class = "custom-control-input"})
        </td>
     </tr>
}

对此更改操作

public ActionResult Activate()
{
     Poll poll = SetPoll();
     PollVM pvm = new PollVM();

     bool b = false;

     if (poll != null)
     {
        pvm = pvm.ToViewModel(poll);
        b = true;
     }

     ViewBag.ViewPopup = b;
     return View(pvm);
}
[HttpPost]
public ActionResult Activate(PollVM pollVM,int OptionID)
{
    User user = UserService.GetCurrent();
    Poll poll = SetPoll();

    bool b = false;

    if (poll != null)
    {
       pollVM = pollVM.ToViewModel(poll);
       b = true;
    }
    Poll_User_Options model = new Poll_User_Options()
    {
       poll_id = pollVM.PollID,
       user_id = user.ID,
       option_id = OptionID
    };
    PollUserOptionsService.Create(model); //model
    

    ViewBag.ViewPopup = b;
    return View(pollVM);
}
public Poll SetPoll()
{
   Poll poll = new Poll()
   {
      id = 1,
      type = 1,
      date_created = DateTime.Now,
      title = "poll1",
      status = 2,
      Poll_Options = new List<Poll_Options>()
      {
         new Poll_Options(){id=1,title="option1",poll_id=1,date_created=DateTime.Now},
         new Poll_Options(){id=2,title="option2",poll_id=1,date_created=DateTime.Now},
         new Poll_Options(){id=3,title="option3",poll_id=1,date_created=DateTime.Now},
      }
   };
   return poll;
}