通过url传递值 - 数据操作

时间:2011-04-04 00:42:14

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

亲爱的,我有一个简单的问题,我无法找到答案。我创建了一个列表视图,在URL中传递不同的数据操作值。我当前的网址类似于:http://localhost/App/Product/List?categoryId=2&countryId=us

我有来自不同类别和国家/地区的产品,是否有人知道我必须传递哪些价值才能展示来自所有国家/地区的产品或来自所有类别的产品而非特定产品?类似/ List?categoryId =“”& countryId =“”

一位同事告诉我要执行以下操作: 我认为你应该使用可以为null的整数(int?)作为categoryid参数的类型:

public ActionResult List(int? categoryid, int? page, string countryId) 
{ 
        var products = null; 
        if (categoryid.HasValue && !string.IsNullOrEmpty(countryId)) { 
                products = ProductRepository.FindCategoryProducts(categoryid, countryId).AsPagination(page.GetValueOrDefault(1), 20); 
        } else if (categoryid.HasValue == false && string.IsNullOrEmpty(countryId)) { 
                products = ProductRepository.GetAllProducts(); 
        } else { 
                /// check the other cases here... 

                return View(products); 
        } 
}

但似乎如果我只有两个参数是可能的,但是有很多参数,我会有很多if - else if if显示所有可能性。

这是过滤数据或存在任何其他选项的唯一方法吗?

任何帮助将不胜感激。 brgds

更新!!:

杰兰,你好,非常感谢你。我有以下控制器:

public ActionResult List(int categoryid, int? page, string countryId)
        {
            var products = ProductRepository.FindCategoryProducts(categoryid, countryId).AsPagination(page.GetValueOrDefault(1), 20);

            return View(products);
        }

Productrepository:

public IQueryable<Product> FindCategoryProducts(int categoryId, string countryId)
        {
            return from product in db.product
                   where product.CategoryId == categoryId 
                   && product.CountryId == countryId
                   orderby product.CreatedOn
                   select product;
        }

然后我可以通过url Product / list?categoryId = 2&amp; countryId = us。但如果我想要检索所有产品,无论哪个国家/地区使用可空字符串,我都会收到错误。 这就是为什么这位同事建议我创建 - if / elseif语句 - 考虑所有参数的可能性,但如果作为一个例子,我有8个参数似乎是一个很长的陈述。

谢谢你!

1 个答案:

答案 0 :(得分:2)

这没有神奇的答案。为了允许对大量可空标准进行过滤,在某处确定如何处理空参数的逻辑。我建议将其作为ProductRepository的责任,而不是页面的Controller。这样可以更容易地在其他控制器中重用相同的逻辑,而不必复制和粘贴它。

如果您使用的是LINQ,则可以在Where子句中执行类似的操作

where Product == (productParm ?? Product)

如果您在SQL中执行此操作,则可以使用类似的运算符

where Product = COALESCE(productParm, Product)

就您提供的查询而言,假设您有其他字符串属性A&amp; B过滤:

public IQueryable<Product> FindCategoryProducts(int categoryId, string countryId, string filterA, string filterB)
        {
            return from product in db.product
                   where product.CategoryId == categoryId 
                   && product.CountryId == (String.IsNullOrEmpty(countryId) ? product.CountryID : countryId)
                   && product.PropertyA == (String.IsNullOrEmpty(filterA) ? product.CategoryA : filterA)
                   && product.PropertyB == (String.IsNullOrEmpty(filterB) ? product.CategoryB : filterB)

                   // and so on...

                   orderby product.CreatedOn
                   select product;
        }

有关?: operator

的更多信息