我正在做一個簡單的搜索頁面在MVC與其中的一些過濾器。過濾器由ViewModel中的屬性表示。我的ViewModel綁定到cshtml中的GET表單,所以我的過濾器將出現在querystrings中,用戶將能夠爲他的搜索添加書籤。默認值爲ViewModel
我想要做的是給我的一些過濾器分配一個默認值。
我(簡化)視圖模型:
public class SearchViewModel
{
//Filter I want to set a default value to
public OrganizationType? OrganizationType {get; set;}
//Results of the search
public IEnumerable<ItemViewModel> Items {get; set;}
}
我想爲OrganizationType設置的默認值。我不能簡單地將其設置在構造SearchViewModel,因爲它依賴於當前用戶:
public void InitViewModel(SearchViewModel vm)
{
vm.OrganizationType = _someLogic.GetDefaultValue(_currentUser);
}
首先解決方式是檢查是否OrganizationType爲空,則指定一個默認值:
public ActionResult Search(SearchViewModel vm)
{
if(vm.OrganizationType == null)
vm.OrganizationType = _someLogic.GetDefaultValue(_currentUser);
return View(vm);
}
但是,此解決方案不起作用null值對應於空過濾器,它是用戶可以選擇的選項。所以我不能重寫它。
我試圖爲指定控制器的默認值應該是在搜索行動無效的第二個解決方案:
public ActionResult Search(SearchViewModel vm = null)
{
if (vm == null)
{
vm = new SearchViewModel();
InitViewModel(vm);
}
...
return View(vm);
}
但在實踐中,變量VM永遠不能爲null,所以默認值從未設置。
我也試過有wihout一個ViewModel兩項行動,一個在那裏我實例化一個新的視圖模型爲默認值,然後調用第二個動作:
public ActionResult Search()
{
var vm = new SearchViewModel();
InitViewModel(vm);
//Simply call the second action with the initizalied ViewModel
return Search(vm);
}
public ActionResult Search(SearchViewModel vm)
{
...
return View(vm);
}
但它不工作,因爲現在是一個有這兩個動作之間的歧義,而asp.net不知道選哪一個。
總之,我想找到一種方法來爲ViewModel設置默認值,而不必在構造函數中設置它並覆蓋用戶選擇。
另一種說法,我怎麼區分一個「空的」ViewModel與某些值綁定在窗體上的ViewModel。
有什麼想法?
爲什麼你不能使用'_currentUser'? – markpsmith
@markpsmith,_currentUser是我的控制器的成員變量,取決於當前的HttpContext。我可以在我的控制器中使用它,但是我無法在ViewModel構造函數中使用它,因爲我沒有乾淨的方式從那裏訪問HttpContext。 – cpaulus
假設你正在使用MVC5和C#5,你可以試試這個嗎? public OrganizationType? OrganizationType {get; set;} = null; //或者你想設置的任何值作爲默認設置 –