C # Необязательный параметр MVC действия объекта

#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. Значения всегда инициализируются, если требования заключаются в том, чтобы они были инициализированы значением, отличным от . Чистые значения по умолчанию, вот для чего предназначен конструктор.