从您提到使用(可能是唯一的)ID 中,您可能需要一个单独的操作方法。但是从您对单一意图的描述来看,单一控制器方法可能是要走的路 - 请注意,您仍然不必手动解析字符串,MVC 模型绑定器可以为您做到这一点。
如果您有单独的方法,它们必须有不同的 URL。它们可能是重载的相同方法名称,但它们仍然必须使用 ActionName 属性进行修饰以分配它们不同的身份。(请注意,您可以使用其他选择器属性来区分,例如 [HttpPost] 或自定义属性。)
请注意,您还可以使用需要参数的 MapRoute(在 Global.asax 中)根据其参数有条件地在 URL 上调用不同的控制器方法。
在一个地方处理所有相同类型的活动的好处是代码变得更清晰、更易于维护并且更不容易出错。如果你发现情况并非如此,那就分手吧。这是我所说的常见的不要重复自己/单点真理/责任分离的东西。
作为一般规则,我在 MVC 中发现 URL 路径(没有查询字符串)、控制器方法和意图都沿着相同的路线分解。例如,这两个 URL 遵循该规则:
http://example.com/person/id/403
http://example.com/person/search?FirstName=Joe&LastName=Smith
我们在 URL 中表达我们的意图,以获取单个人或可能的多个匹配项。
你说你可能会传递一个缩写(听起来不像是唯一的),作为两个参数之一。如果每个可选参数都是独立唯一的,那么一次形成一个以上的问题可能没有意义。如果您可能有 a、b 或 a 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) {
编辑2:还请注意,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
祝你好运!