是否可以在某种程度上使用默认值将对象指定为MVC中的参数?
E.g。
public virtual ViewResult Index(RequirementFilters requirementFilters)
我想在RequirementFilters上初始化几个参数的值?
我正在做的那一刻
public virtual ViewResult Index(int status=1, bool required =false)
我想创建一个过滤器对象,以便我可以重复使用它,但我无法找到在动作参数中设置对象默认值的方法。
由于
格雷姆
答案 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)
只要您不需要更改每个操作的默认值,就可以在模型的默认构造函数中设置它们。