Asp.net C可选对象操作MVC参数
是否可以在MVC中以某种方式使用默认值将对象指定为参数 例如 我想初始化RequirementFilter上几个参数的值 现在我正在做什么Asp.net C可选对象操作MVC参数,asp.net,asp.net-mvc-3,c#-4.0,Asp.net,Asp.net Mvc 3,C# 4.0,是否可以在MVC中以某种方式使用默认值将对象指定为参数 例如 我想初始化RequirementFilter上几个参数的值 现在我正在做什么 public virtual ViewResult Index(int status=1, bool required =false) 我想创建一个过滤器对象,这样我就可以重复使用它,但我想不出在动作参数中为对象设置默认值的方法 谢谢 Graeme您可以创建一个自定义ActionFilter属性,并在那里创建筛选器对象的实例。您可以通过自定义属性提供一些属
public virtual ViewResult Index(int status=1, bool required =false)
我想创建一个过滤器对象,这样我就可以重复使用它,但我想不出在动作参数中为对象设置默认值的方法
谢谢
Graeme您可以创建一个自定义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来指定将被实例化的实际类型。用户有时更喜欢在屏幕上查看默认值,而不是允许系统在内部隐藏默认值 拥有默认值的一个更好的方法是,通过将默认值与int UI一起呈现,在HTML中实际显示int UI上的默认值。这样,当有人发布页面时,您预先呈现的默认值也会发布并绑定到模型 因此,请尝试并查看是否可以使用默认值渲染正在渲染并发布到索引操作的任何内容 最后,如果不能这样做,那么在创建对象时,是什么阻止您使用无参数构造函数中的默认值初始化属性 编辑
或者,您可以使用C语言特性null coalession操作符来实现默认值。请阅读。只要不需要更改每个操作的默认值,就可以在模型的默认构造函数中设置它们。是的,默认值会显示出来。这只是第一次访问索引,我需要初始化过滤器。第一次访问索引,如果最初没有参数,您可以尝试使用URL中的一些参数重定向到索引。我还用另一种解决方案编辑了答案。我在使用两种索引方法时遇到了问题。我似乎无法根据参数重载索引。我发现了这一点,并建议我不能。谢谢,让我们来看看这一点。我正在使用IModelEnricher做一些类似的事情,我用它来填充选择列表和其他ViewModel属性,以保持控制器的this在ViewModel构造函数中初始化值是一种好做法吗?值总是初始化的,如果要求将它们初始化为不同于.Net默认值的值,则构造函数就是这样做的。
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;
}
}