我有一个传递给它的FilterModel的动作。我使用搜索将过滤器传递给操作,或者我调用操作而不向其传递过滤器。当我正常调用它时,过滤器被实例化(我没想到会发生这种情况)。如何检查实际没有通过过滤器?
我的模特:
public class ProductFilterModel
{
//Using a constructor so the search view gets a default value.
public ProductFilterModel()
{
MinPrice = 500;
MaxPrice = 1000;
}
public int MinPrice { get; set; }
public int MaxPrice { get; set; }
}
动作:
public ActionResult Index(ProductFilterModel filter){
//How do I check if no filter was passed?
}
对该操作的正常调用是localhost/Products
,而过滤后的调用将为localhost/Products?MinPrice=5&MaxPrice=100
当我的操作正常接收呼叫时,过滤器默认为上面设置的值,因此我甚至无法检查MinPrice
是否为0以便知道正常加载它。
答案 0 :(得分:3)
您可以检查ModelState.Count。如果ModelState.Count == 0,那么在绑定期间没有为您的模型设置值。
答案 1 :(得分:1)
我会:
MinPrice
,MaxPrice
可以为空,这样我只能在Min或Max上进行过滤,而不能在两者上进行过滤。Index
如下:(假设你总是有过滤器)
public ActionResult Index(ProductFilterModel filter){
filter = filter ?? new ProductFilterModel();
if (filter.MinPrice.HasValue)
FilterOnMin();
if (filter.MaxPrice.HasValue)
AlsoFilterOnMax();
}
答案 2 :(得分:0)
您正在使用视图模型来显示和提交数据,那么为什么不使用2个构造函数,从而使您的意图更明确?
public class ProductFilterModel
{
private int? _minPrice;
private int? _maxPrice;
public class ProductFilterModel( int defaultMinPrice, int defaultMaxPrice )
{
MinPrice = defaultMinPrice;
MaxPrice = defaultMaxPrice;
}
public class ProductFilterModel()
{
}
public int MinPrice
{
get { return _minPrice.HasValue ? _minPrice.Value ? 0; }
set { _minPrice = value; }
}
public int MaxPrice
{
get { return _maxPrice.HasValue ? _maxPrice.Value ? Int32.MaxValue; }
set { _maxPrice = value; }
}
public bool HasFilter
{
get { return _minPrice.HasValue || _maxPrice.HasValue; }
}
}