我有一个显示项目列表的结果视图。
在某些情况下,我想显示一个字段与查询参数匹配的项目。在其他情况下,我想显示另一个字段与查询参数匹配的项目。等等。
如何为我的控制器/视图提供参数,以便它知道要获得哪种结果?我可以编写多个控制器,但后来我得到的错误是“Type'MyType'已经定义了一个名为'MyMethod'且具有相同参数类型的成员。”
理想情况下,我可以找到一种方法来做到这一点,而无需创建其他路线。这可能吗?
答案 0 :(得分:0)
根据我对您的问题的理解,您希望执行以下操作:
您可以在方法中添加一个额外的参数,以便您可以根据额外参数的值执行不同的查询:
public class QueryController
{
private enum QueryType
{
TypeA = 0,
TypeB = 1,
TypeC = 2
}
[HttpGet]
public void ShowResults(QueryType type, string criteria)
{
/*
* Code here to make the query using the field you want,
* depending on the "type" parameter e.g.
*
* switch (type)
* {
* case TypeA:
* model = db.Items.Where(x => x.FieldA == criteria);
* break;
* case TypeB:
* model = db.Items.Where(x => x.FieldB == criteria);
* break;
* }
*/
return View(model);
}
}
另外,不要担心路由,默认路由{controller} / {method} / {id}不要求您必须以严格的方式指定URL。这是前一个示例的有效URL:
http://www.example.com/App/Query/ShowResults?type=1&criteria=foo
默认的MVC活页夹将使用URL中的参数名称将其值绑定到方法的参数。
我希望我没有误解你的问题。
祝你好运!答案 1 :(得分:0)
使用MVC,查询字符串值映射到参数值(并且路由用于创建自定义映射)。
但有一些特殊例外。如果参数是FormCollection
(基本上只是Dictionary<string>
),那么将传入所有未映射的查询字符串值。
因此,您可以创建一个包含所有参数的Action
:
// GET: MyController/ViewList?name=aaa&field1=foo&field2=bar
public ActionResult ViewList(string name, FormCollection otherFields) {
foreach (var field in otherFields) {
switch (field.Key.ToLower()) {
case "field1":
// Filter field1 based on field.Value
case "field2":
// Filter field2 based on field.Value
...
}
}
...
}
同样,您也可以没有参数,只需使用this.Request.QueryString
来检查查询字符串值。但是,我更喜欢FormCollection
方法,因为它清楚地表明了我期望的其他参数。