使用ViewModel发布到模型中

时间:2016-03-11 00:07:55

标签: c# asp.net-mvc

我有一个模型和两个视图模型

型号:

 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而不是网页,我想知道我想做什么是错误的步骤

2 个答案:

答案 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无效而需要返回视图,则需要重新分配AddTimeWebpage属性的值。

话虽如此,你的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);