C#可选对象操作MVC参数

时间:2011-10-12 14:59:35

标签: asp.net asp.net-mvc-3 c#-4.0

是否可以在某种程度上使用默认值将对象指定为MVC中的参数?

E.g。

    public virtual ViewResult Index(RequirementFilters requirementFilters)

我想在RequirementFilters上初始化几个参数的值?

我正在做的那一刻

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

我想创建一个过滤器对象,以便我可以重复使用它,但我无法找到在动作参数中设置对象默认值的方法。

由于

格雷姆

3 个答案:

答案 0 :(得分:4)

您可以创建自定义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 :(得分:1)

用户有时更喜欢在屏幕上看到默认值,而不是允许系统在内部隐藏默认值。

更好的默认方法是在HTML中实际显示默认值,在HTML中通过与默认值一起呈现它。这样,当有人发布页面时,您预先渲染的默认值也会发布并绑定到模型。

因此,请尝试查看是否可以使用默认值进行渲染,无论是渲染还是发布到Index操作。

最后,如果你不能这样做,是什么阻止你在创建对象时使用no-arg构造函数中的默认值初始化属性?

修改

或者您可以使用C#语言功能使用null coalescent运算符来实现默认值。看here来阅读它。

答案 2 :(得分:1)

只要您不需要更改每个操作的默认值,就可以在模型的默认构造函数中设置它们。