#asp.net #asp.net-mvc-3 #c#-4.0
#asp.net #asp.net-mvc-3 #c#-4.0
Вопрос:
Возможно ли каким-либо образом указать объект в качестве параметра в MVC со значениями по умолчанию?
Например.
public virtual ViewResult Index(RequirementFilters requirementFilters)
Я хотел бы инициализировать значения нескольких параметров в RequirementFilters?
На данный момент я делаю
public virtual ViewResult Index(int status=1, bool required =false)
Я хотел создать объект фильтра, чтобы я мог повторно использовать его, но я не могу понять, как установить значения по умолчанию для объекта в параметрах действия.
Спасибо
Грэм
Ответ №1:
Вы могли бы создать пользовательский атрибут ActionFilter и создать экземпляр вашего объекта фильтра там. Вы можете предоставить некоторые свойства с помощью пользовательского атрибута.
Вот пример:
public class DefaultQuerySettingsAttribute : ActionFilterAttribute
{
public string ParameterName { get; set; }
public Type SettingsType { get; set; }
public int Rows { get; set; }
public string SortColumn { get; set; }
public string SortOrder { get; set; }
public bool PagingEnabled { get; set; }
public DefaultQuerySettingsAttribute()
{
this.ParameterName = "settings";
var defaultSettings = new QuerySettings();
this.Rows = defaultSettings.Rows;
this.SortColumn = defaultSettings.SortColumn;
this.SortOrder = defaultSettings.SortOrder;
this.PagingEnabled = defaultSettings.PagingEnabled;
}
public override void OnActionExecuting(ActionExecutingContext filterContext)
{
base.OnActionExecuting(filterContext);
if (filterContext.ActionParameters.ContainsKey(this.ParameterName))
{
var querySettings = filterContext.ActionParameters[this.ParameterName] as QuerySettings;
if (querySettings == null || string.IsNullOrWhiteSpace(querySettings.SortColumn))
filterContext.ActionParameters[this.ParameterName] = this.GetQuerySettings();
}
}
private QuerySettings GetQuerySettings()
{
var querySettings = (QuerySettings)Activator.CreateInstance(SettingsType ?? typeof(QuerySettings));
querySettings.Rows = Rows;
querySettings.SortColumn = SortColumn;
querySettings.SortOrder = SortOrder;
querySettings.PagingEnabled = PagingEnabled;
return querySettings;
}
}
ParameterName
это имя аргумента в методе действия ( requirementFilters
в вашем случае).
Вы также можете указать фактический тип, который будет создан путем предоставления SettingsType
.
Комментарии:
1. Спасибо, посмотрим, как это сделать, я делаю что-то немного похожее с IModelEnricher, который я использую для заполнения списка выбора и других атрибутов ViewModel, чтобы сохранить контроллер тонким
Ответ №2:
Пользователи иногда предпочитают видеть значения по умолчанию на экране, а не разрешать системе скрывать значения по умолчанию внутри.
Лучшим способом использования значений по умолчанию будет фактическое отображение значений по умолчанию в int UI в HTML путем рендеринга его вместе со значениями по умолчанию. Таким образом, когда кто-то публикует страницу, значения по умолчанию, которые вы предварительно отрисовали, также публикуются и привязываются к модели.
Итак, попробуйте и посмотрите, можете ли вы отображать по умолчанию все, что вы отображаете, и отправлять в Index
действие.
Наконец, если вы не можете сделать это таким образом, что мешает вам инициализировать свойства значениями по умолчанию в конструкторе без аргументов при создании объекта?
Редактировать
Или вы можете использовать функцию языка C # оператор объединения null для реализации значений по умолчанию. Посмотрите здесь, чтобы прочитать об этом.
Комментарии:
1. Да, показаны значения по умолчанию. Это просто первое посещение index, которое мне нужно для инициализации фильтров.
2. При первом посещении index вы можете попробовать перенаправить на Index с некоторыми параметрами в URL, если изначально параметров нет. Я также отредактировал ответ другим решением
3. У меня возникли проблемы с двумя методами индексации. Кажется, я не могу перегрузить индекс на основе параметров. Я нашел это msdn.microsoft.com/en-us/library / … и предполагает, что я не могу.
Ответ №3:
Пока вам не нужно изменять значения по умолчанию для каждого действия, вы можете установить их в конструкторе модели по умолчанию.
Комментарии:
1. Рекомендуется ли инициализировать значения в конструкторе ViewModel?
2. Значения всегда инициализируются, если требования заключаются в том, чтобы они были инициализированы значением, отличным от . Чистые значения по умолчанию, вот для чего предназначен конструктор.