使用另一个视图模型从视图中的一个模型创建记录
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">×</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;
}
我有 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">×</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;
}