Страница MVC для принятия различных аргументов запроса - PullRequest
1 голос
/ 25 октября 2011

У меня есть представление результатов, в котором отображается список элементов.

В некоторых случаях я хочу отображать элементы, в которых одно поле соответствует аргументу запроса.В других случаях я хочу отображать элементы, где другое поле соответствует аргументу запроса.И т. Д.

Как я могу предоставить аргументы своему контроллеру / представлению, чтобы он знал, какие результаты получить?Я мог бы написать несколько контроллеров, но потом я получаю ошибку, что «Тип« MyType »уже определяет член с именем« MyMethod »с тем же типом параметра».

В идеале, я мог бы найти способ сделать это безсоздание дополнительных маршрутов.Это возможно?

Ответы [ 2 ]

0 голосов
/ 25 октября 2011

В 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, потому что он дает понять, что я ожидаю других параметров.

0 голосов
/ 25 октября 2011

Из того, что я понимаю из вашего вопроса, вы хотите сделать следующее:

  • Повторно использовать представление, чтобы вам не нужно было создавать его для каждого запроса.
  • Используйте одно и то же имя метода в контроллере, чтобы у вас не было разных 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-адресе для привязки их значений к параметрам вашего метода.

Надеюсь, я не правильно понял ваш вопрос.

Удачи!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...