MVC页面接受不同的查询参数

时间:2011-10-25 03:15:21

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

我有一个显示项目列表的结果视图。

在某些情况下,我想显示一个字段与查询参数匹配的项目。在其他情况下,我想显示另一个字段与查询参数匹配的项目。等等。

如何为我的控制器/视图提供参数,以便它知道要获得哪种结果?我可以编写多个控制器,但后来我得到的错误是“Type'MyType'已经定义了一个名为'MyMethod'且具有相同参数类型的成员。”

理想情况下,我可以找到一种方法来做到这一点,而无需创建其他路线。这可能吗?

2 个答案:

答案 0 :(得分:0)

根据我对您的问题的理解,您希望执行以下操作:

  • 重复使用视图,这样您就不必为每个查询创建一个视图。
  • 在控制器上使用相同的方法名称,以便每个查询都没有不同的URL。

您可以在方法中添加一个额外的参数,以便您可以根据额外参数的值执行不同的查询:

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方法,因为它清楚地表明了我期望的其他参数。