C # Дополнительный объект Действие MVC Параметр - PullRequest
4 голосов
/ 12 октября 2011

Можно ли как-то указать объект в качестве параметра в MVC со значениями по умолчанию?

Например,

    public virtual ViewResult Index(RequirementFilters requirementFilters)

Я хотел бы инициализировать значения парыпараметры в RequirementFilters?

В данный момент я делаю

public virtual ViewResult Index(int status=1, bool required =false)

Я хотел создать объект фильтра, чтобы я мог использовать его повторно, но не могу найти способ установки значений по умолчаниюза объект в параметрах действия.

Спасибо

Грэм

Ответы [ 3 ]

4 голосов
/ 12 октября 2011

Вы можете создать собственный атрибут ActionFilter и создать там экземпляр объекта Filter.Вы можете предоставить некоторые свойства через пользовательский атрибут.

Вот пример:

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 голос
/ 12 октября 2011

Пока вам не нужно изменять значения по умолчанию для каждого действия, вы можете установить их в конструкторе модели по умолчанию.

1 голос
/ 12 октября 2011

Пользователи иногда предпочитают видеть значения по умолчанию на экране, вместо того, чтобы позволить системе скрывать значения по умолчанию внутри.

Лучшим способом использования значений по умолчанию будет фактическое отображение значений по умолчанию в пользовательском интерфейсе int в HTMLпредоставляя его вместе со значениями по умолчанию.Таким образом, когда кто-то публикует страницу, значения по умолчанию, которые вы предварительно отображали, также публикуются и привязываются к модели.

Так что попробуйте и посмотрите, можете ли вы выполнить рендеринг с настройками по умолчанию независимо от того, что вы делаете, и опубликовать в Index action.

Наконец, если вы не можете сделать это таким образом, что мешает вам инициализировать свойства со значениями по умолчанию в конструкторе no-arg при создании объекта?

РЕДАКТИРОВАТЬ

Или вы можете использовать языковую функцию C # с нулевым коалесцентным оператором для реализации значений по умолчанию.Посмотрите здесь , чтобы прочитать об этом.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...