ASP.NET MVC:检查绑定模型是否实际传递给操作

时间:2010-11-10 23:32:08

标签: asp.net-mvc asp.net-mvc-2

我有一个传递给它的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以便知道正常加载它。

3 个答案:

答案 0 :(得分:3)

您可以检查ModelState.Count。如果ModelState.Count == 0,那么在绑定期间没有为您的模型设置值。

答案 1 :(得分:1)

我会:

  1. 使MinPriceMaxPrice可以为空,这样我只能在Min或Max上进行过滤,而不能在两者上进行过滤。
  2. 未在ViewModel上设置默认值。
  3. 从创建过滤器的操作设置默认值。
  4. 实施Index如下:
  5. (假设你总是有过滤器)

    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; }
  }
}