如何使用多个可能的参数创建GET

时间:2012-08-31 23:12:40

标签: html asp.net-mvc

我正在使用 ASP.NET Web API(4 RTM),并希望创建一个方法来处理GET请求。将此视为GetCustomer()来处理我的GET请求 现在,按客户ID获取客户非常简单;我在querystring中传递了客户ID,然后我们就开始运行了。假设我希望选项传递两个可能的参数之一;表示客户的整数或缩写。

一个选项是使用单个方法来处理整数和字符串的GET请求。然后,在方法内部,我可以测试该值是否能够被解析为整数并相应地处理它。但这是处理这种情况的正确方法吗?

如果我应该有两种不同的方法,我该怎么做?

2 个答案:

答案 0 :(得分:0)

就个人而言,我只使用这种代码的一个入口点:

http://example.com/lookupUser?id=18475
http://example.com/lookupUser?userCode=jjs
http://example.com/lookupUser?FullName=Jeremy%20J%20%Starcher

好吧,也许不是最后一个例子,因为可能有多次点击。

答案 1 :(得分:0)

从您提到使用(可能是唯一的)ID,您可能需要一个单独的操作方法。但是从你对单个 intent 的描述中,单个控制器方法可能就是这样 - 并注意你仍然不必手动解析字符串,MVC模型绑定器可以为你做到这一点

如果您有单独的方法,则必须使用不同的网址。它们可能是重载的方法名称相同,但是它们仍然必须使用ActionName属性进行修饰,以便为它们分配不同的标识。 (注意,您可以使用其他选择器属性来区分,例如[HttpPost]或自定义属性。)

请注意,您还可以使用需要参数的MapRoute(在Global.asax中)根据其参数有条件地调用URL上的不同控制器方法。

在一个地方处理所有相同类型的活动的好处是代码变得更清晰,更易于维护,并且不易出现缺陷。如果您发现情况并非如此,那么将其分解。这是通常不要重复自己/单点真相/我正在谈论的责任分离。

作为一般规则,我在MVC中发现URL路径(没有查询字符串),Controller方法和intent all都沿着相同的行分解。例如,这两个网址遵循该规则:

http://example.com/person/id/403
http://example.com/person/search?FirstName=Joe&LastName=Smith

我们在网址中表达我们的意图,以获得单个人或可能的多个匹配。

你说你可能会传递一个缩写(听起来不像是唯一的),作为两个参数之一。如果每个可选参数都是独立的,那么一次形成一个以上的问题可能没有意义。如果您可能有a,b或AND b,那么在实际输入自定义控制器逻辑的主力之前,确定将请求传递给哪个方法会很复杂。

此外,像LINQ这样的技术可以很容易地在程序上动态地组合您的查询,从而对结果有一个或两个约束。

[HttpGet]
public ViewResult Search(string FirstName, string LastName) {
     var people = AllPeopleInDatabase();
     if (!string.IsNullOrEmpty(FirstName)) people=people.Where(p => p.FirstName==FirstName);
     if (!string.IsNullOrEmpty(LastName)) people=people.Where(p => p.LastName==LastName);
     return View(people);
}

将一个唯一的ID放入该混合中对我来说没有意义,因为我无法想到一个编程方案(除了相当独特的密码验证情况),你只想得到指定的记录另一个标准匹配。因此,如果有人要求提供ID并且它不存在,则可能是一个错误情况,如果有人按标准搜索不会产生结果,则可能不是错误情况。但是,你仍然可以:

public ViewResult Search(string FirstName, string LastName, int? id) {

编辑:还要注意,模型绑定器将处理类的属性,这是绑定多个参数的典型方法:

public ViewResult Search(MyCriteriaViewModel criteria) {

edit2:还要注意RESTful服务(WebAPI非常适合)具有CRUD URL的标准实践。以下内容来自http://www.asp.net/web-api/overview/creating-web-apis/creating-a-web-api-that-supports-crud-operations

Action                      HTTP method  Relative URI
Get a list of all products  GET          /api/products
Get a product by ID         GET          /api/products/id
Get a product by category   GET          /api/products?category=category
Create a new product        POST         /api/products
Update a product            PUT          /api/products/id
Delete a product            DELETE       /api/products/id
祝你好运!