下面是我用簡單的視圖模型: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);
}
}
,但它是一個有點冗長,而且容易出錯,因爲它不是很明顯提交什麼樣的屬性,什麼都可以重新設置。有沒有更好的辦法?
例如,我可以有視圖模型獲取數據本身(例如,使用服務定位),但是這是不好的,因爲控制器應該準備的數據。