Как получить параметры из URL - PullRequest
1 голос
/ 16 ноября 2011

У меня есть следующий URL:

http://localhost:58124/Tag/GetData?filter(Tag)=contains(112)&filter(Process)=contains(112)&page=0&pageSize=30

Если я объявлю результат своего действия следующим образом

public ActionResult GetData(int page, int pageSize)

Я получаю значения page и pageSize , заполненные параметрами. Как я могу получить фильтр (тег) и фильтр (процесс) значения из параметров?

РЕДАКТИРОВАТЬ: Строка может иметь n номеров этих параметров фильтра ( name ). Есть ли способ собрать их все или мне нужно получить их по отдельности?

Ответы [ 3 ]

1 голос
/ 16 ноября 2011

Вы можете получить доступ к свойству QueryString HttpRequestBase класса через Запрос свойство.

public ActionResult GetData(int page, int pageSize)
{
    var queryString = Request.QueryString;
    var filter = queryString["filter(Tag)"];

    ///
}
0 голосов
/ 16 ноября 2011

Похоже, что хороший кандидат для связки пользовательских моделей:

public class FilterViewModel
{
    public string Key { get; set; }
    public string Value { get; set; }
}

public class FilterViewModelBinder : DefaultModelBinder
{
    public override object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext)
    {
        var filterParamRegex = new Regex(bindingContext.ModelName + @"\((?<key>.+)\)", RegexOptions.IgnoreCase | RegexOptions.Compiled);
        return
            (from key in controllerContext.HttpContext.Request.Params.AllKeys
            let match = filterParamRegex.Match(key)
            where match.Success
            select new FilterViewModel
            {
                Key = match.Groups["key"].Value,
                Value = controllerContext.HttpContext.Request[key]
            }).ToArray();
    }
}

, который будет зарегистрирован в Application_Start:

ModelBinders.Binders.Add(typeof(FilterViewModel[]), new FilterViewModelBinder());

и затем:

public ActionResult GetData(FilterViewModel[] filter, int page, int pageSize)
{
    ...
}

Преимущество пользовательского связывателя модели заключается в том, что он делает именно то, что предлагает его имя: связывание пользовательской модели, поскольку параметры строки запроса не соответствуют стандартным соглашениям, используемым связывателем модели по умолчанию. В дополнение к этому ваше действие контроллера чисто и просто, и ему не нужно полагаться на какой-то уродливый код, который, очевидно, не является обязанностью действий контроллера.

0 голосов
/ 16 ноября 2011

Один из способов сделать это - отфильтровать параметры, начиная с «фильтра», и повторить результат. В цикле foreach вы можете поместить их в список или что-то в зависимости от того, как вы планируете их использовать. Я использую System.Linq для удобства:

using System.Diagnostics;
using System.Web.Mvc;
using System.Linq;

namespace ImgGen.Controllers
{
    public class TagController : Controller
    {
        public ActionResult GetData(int page, int pageSize)
        {
            var filters = Request.QueryString.AllKeys.ToList().Where(key => key.StartsWith("filter"));
            foreach (var filter in filters)
            {
                var value = Request.QueryString.GetValues(filter)[0];
                Debug.Print(filter + " = " + value);
            }
            return View();
        }
    }
}

Надеюсь, это поможет.

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