2009-11-13 51 views
2

下面是我用簡單的視圖模型:ASP.NET MVC:使用同一視圖模型渲染頁面,並得到結果

public class ViewModel 
{ 
    public Order Order { get; set; } 
    // returned from page - also can be pre-selected 
    public string[] SelectedProducts { get; set; } 
    // data for page to render available products to select from 
    public IList<ProductViewModel> AvailableProducts { get; set; } 
} 

public ActionResult Edit(Order order) 
{ 
    return View(new ViewModel { Order = order, SelectedProducts = new string[0], AvailableProducts = repository.GetAvailable() }); 
} 

(注意順序爲auto-勢必通過POST自定義模型粘合劑)

現在,我確實返回View(新的ViewModel(...)),它的工作原理。 GET/Edit頁面呈現可用產品,用戶選擇它們,然後提交從SelectedProducts中選擇的POST/Edit動作選擇。

問題是,當用戶輸入無效 - 我需要不碰輸入的用戶數據重新顯示頁面,同時還提供AvailableProducts。只需返回查看(數據)將不起作用,因爲AvailableProducts不是提交的數據的一部分,並且爲空。

的問題是:我該如何解決這個問題?我可以做

public ActionResult(ViewModel data) 
{ 
    if (!ModelState.IsValid) 
    { 
     data.AvailableProducts = repository.GetAvailable(); 
     return View(data); 
    } 
} 

,但它是一個有點冗長,而且容易出錯,因爲它不是很明顯提交什麼樣的屬性,什麼都可以重新設置。有沒有更好的辦法?

例如,我可以有視圖模型獲取數據本身(例如,使用服務定位),但是這是不好的,因爲控制器應該準備的數據。

回答

3

我不知道一個更好的方式來做到這一點,雖然你可能想將它重構爲可重複使用的兩個單獨的方法動作。

private ViewModel PopulateModelForView(Order order, string[] products) 
{ 
    return new ViewModel 
      { 
       Order = order, 
       SelectedProducts = products ?? new string[], 
       AvailableProducts = repository.GetAvailable() 
      }; 
} 

public ActionResult Edit(Order order) 
{ 
    return View(PopulateModelForView(order, null)); 
} 

public ActionResult Update(ViewModel data) 
{ 
    if (!ModelState.IsValid) 
    { 
     return View(PopulateModelForView(data.Order, data.SelectedProducts)); 
    } 
} 
0

我做的只是創建我的傳入的輸入參數作爲一個新的觀點。所以,那就是:

public ActionResult Create([Bind(Exclude = "Id")]Profiles profileToAdd) 
{ 
     try{ 
      your shiny code here 
     } 
     catch{ 
      return View(new ProfileFormViewModel(profileToAdd)); 
     } 
} 

,這留下未在紅色正確填寫,並在選項別人你已經正確地設置了現場。我不知道這是你想要的嗎?

你的情況,你可以讓列表進來的方法輸入或重新生成它。隨你喜歡。不是再次通過您的視圖模型發送(編輯):

public ActionResult Create(Order order, IList<ProductViewModel> AvailableProducts) 
{ 
     try{ 
      UpdateModel(order); 
      SaveChanges(); 
     } 
     catch{ 
      return View(new ViewModel(order, AvailableProducts)); 
     } 
} 
相關問題