我有一个模型和两个视图模型
型号:
public class WebPages
{
[Key]
public int WebPagesId { get; set; }
public String DomainName { get; set; }
public DateTime DomainStart { get; set; }
public DateTime DomainExp { get; set; }
}
视图模型:
public class WebPagesViewModel
{
public String DomainName { get; set; }
public DateTime DomainStart { get; set; }
public List<SelectListItem> DurationDays { set; get; }
public int SelectedDurationDays { set; get; }
}
所以这些控制器是:
//Get controller
public ActionResult Create(WebPages model)
{
var vm = new WebPagesViewModel
{
DurationDays = new List<SelectListItem>()
{
new SelectListItem {Value = "1", Text = "1 año"},
new SelectListItem {Value = "2", Text = "2 años"}
}};
retrun View(vm);
}
//Post controller
public async Task<ActionResult> Create(WebPagesViewModel model)
{
var endDate = DateTime.Now.AddYears(model.SelectedDurationDays);
var webnew = new WebPages
{
DomainName = model.DomainName,
DomainStart = model.DomainStart,
DomainExp = endDate
};
db.WebPagesList.Add(webnew);
db.SaveChanges();
return View(model);
这项工作没问题,我没有任何问题,我想要做的是在我的数据库的特定DomainExp
的现有DomainName
添加新日期。
我尝试这样做,创建另一个ViewModel并像这样创建View:
public class RenewalViewModel
{
public int SelectedDurationDays { set; get; }
public List<SelectListItem> AddTime { get; set; }
public int SelectedWebPage { get; set; }
public IEnumerable<SelectListItem> Webpage { get; set; }
}
}
控制器:
[HttpGet]
public async Task<ActionResult> Renewal()
{
var vm = new RenewalViewModel
{
AddTime = new List<SelectListItem>
{
new SelectListItem {Value = "1", Text = "1 año"},
new SelectListItem {Value = "2", Text = "2 años"},
new SelectListItem {Value = "3", Text = "3 años"},
new SelectListItem {Value = "4", Text = "4 años"},
new SelectListItem {Value = "5", Text = "5 años"},
new SelectListItem {Value = "6", Text = "6 años"},
new SelectListItem {Value = "7", Text = "7 años"},
new SelectListItem {Value = "8", Text = "8 años"},
new SelectListItem {Value = "9", Text = "9 años"}
},
Webpage = new SelectList(db.WebPagesList,"WebPagesId", "DomainName")
};
return View(vm);
}
[HttpPost]
public async Task<ActionResult> Renewal(RenewalViewModel vm)
{
var addDays = DateTime.Now.AddYears(vm.SelectedDurationDays);
var webpage = new WebPages
{
DomainExp = addDays
};
db.Entry(webpage).State = EntityState.Modified;
return View(webpage);
}
但在return View(webpage);
我有这个问题
xxx Models.Webpages不能分配给模型类型xxx.Models.ViewModel.RenewalViewModel
我知道这是因为我在我的视图中调用了RenewalViewmodel而不是网页,我想知道我想做什么是错误的步骤
答案 0 :(得分:0)
您将返回模型,而不是ViewModel。该模型用于持久性,ViewModel用于您的UI。如果您需要UI操作的输出,那么您需要将其添加为ViewModel上的属性。
更改
return View(webpage);
要:
return View(vm);
或者,如果您不想返回VM:
return new HttpStatusCodeResult(HttpStatusCode.OK);
答案 1 :(得分:0)
发生错误是因为您的视图有@model RenewalViewModel
,但您向其传递了WebPages
的实例。要解决该错误,您需要将return语句修改为
return View(vm);
但是,这会导致更多错误,因为List<SelectListItem>
属性的集合都是null
。如果要返回视图以进行更多选择,则正确的方法是重定向回GET方法(即PRG模式)。但是,如果由于ModelState
无效而需要返回视图,则需要重新分配AddTime
和Webpage
属性的值。
话虽如此,你的POST方法中的代码没有意义。您所做的只是创建Webpages
的新实例并保存它。如果您想要为选定的Webpages
添加天数,那么您需要从数据库中再次获取它,更新它然后保存它。代码应该是
[HttpPost]
public async Task<ActionResult> Renewal(RenewalViewModel vm)
{
if (!ModelSTate.IsValid)
{
// Populate the SelectList's
model.Webpage = ....
model.AddTime = ....
return View(vm);
}
// Get the data model
WebPages model = db.WebPagesList.Where(x => x.WebPagesId == vm.SelectedWebPage).FirstOrDefault();
if (model != null)
{
// Not really sure if you mean AddYears or AddDays?
model.DomainExp = model.DomainExp.AddYears(vm.SelectedDurationDays);
db.Entry(model).State = EntityState.Modified;
db.SaveChanges();
}
// Redirect
return RedirectToAction(....);
}
旁注:不要在GET和POST方法中重复代码,而是创建一个单独的方法
private void ConfigureRenewalViewModel(RenewalViewModel model)
{
model.Webpage = ....
model.AddTime = ....
}
然后在返回视图之前在两个方法中调用它
ConfigureRenewalViewModel(vm);
return View(vm);