Я делаю простой Поиск в странице в MVC с некоторыми фильтрами в нем. Фильтры представлены свойствами в моей модели ViewModel. My ViewModel привязан к форме GET в cshtml, поэтому мой фильтр появится в querystrings, и пользователь сможет добавить в закладки свой поиск.Значение по умолчанию для ViewModel
Что я хочу сделать, это присвоить значение по умолчанию некоторым из моих фильтров.
My (упрощенный) 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 никогда не является нулевым, поэтому по умолчанию значения никогда не устанавливаются.
Я также попробовал наличие двух действий, один заменяется без модели представления, где я новый создания экземпляра 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 от той, где некоторые значения привязаны к форме.
Есть идеи?
Почему вы не можете использовать '_currentUser'? – markpsmith
@markpsmith, _currentUser является переменной-членом моего контроллера, которая зависит от текущего HttpContext. Я могу использовать его в моем контроллере, но я не могу использовать его в конструкторе ViewModel, поскольку у меня нет чистого способа доступа к HttpContext. – cpaulus
Предполагая, что вы используете MVC5 и C# 5, можете ли вы попробовать это? общественная организацияType? OrganizationType {get; set;} = null; // или любое другое значение, которое вы хотите установить по умолчанию –