2016-03-11 27 views
-1

我有一個模型和兩個的ViewModels使用視圖模型發佈到模型

型號:

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

這工作好,我沒有任何問題MS,我想要做的是添加新的日子到現有的DomainExp特定的DomainName我的數據庫。

我嘗試這樣做,創建另一個視圖模型和創建視圖像這樣的:

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型號.Webpages不能分配給模型類型xxx.Models.ViewModel.RenewalViewModel

我知道這是因爲我在我看來RenewalViewmodel而不是網頁叫,我想知道什麼是我的錯步這樣做,我想

+0

視圖中的模型是@model RenewalViewModel,因此您需要返回一個'RenewalViewModel',而不是'WebPages'模型​​ - 即'return View(vm);' –

+0

但在這種情況下我該如何比較'大教堂如果'DomainExp'進入了'WebPages'模型​​ – Eduard

+0

對不起,我不理解您的評論 - 沒有在您的'續訂'方法或相關視圖模型中的任何現有'WebPages'的引用 - 你所有正在創建並保存一個新的「WebPages」。 –

回答

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); 
+0

我看到你接受了,然後未被接受。有沒有你不明白的東西? –

+0

太棒了,你可以推薦我閱讀以創建單獨的方法嗎?我假設我在控制器中使用'private void ...','model.Webpages'等於網頁模型的'DomainName' – Eduard

+0

'private void ConfigureRenewalViewModel(RenewalViewModel模型)'在控制器中,意思是代替必須複製在GET和POST中創建SelectLists的代碼(如果您需要返回視圖) - 僅在一個位置 - 即DRY主體。但我不明白你的意思是_'model.Webpages'等於'DomainName'的網頁模型_ –

0

你回來模型,而不是視圖模型。該模型用於持久性,ViewModel適用於您的用戶界面。如果您需要UI操作的輸出,那麼您需要將其添加爲ViewModel上的屬性。

變化

return View(webpage); 

要:

return View(vm); 

或者,如果你不想返回VM:發生

return new HttpStatusCodeResult(HttpStatusCode.OK);