MVC передают идентификаторы, разделенные знаком «+» - PullRequest
6 голосов
/ 24 декабря 2011

Я хочу иметь возможность доступа к действию по следующему типу URL:

http://localhost/MyControllerName/MyActionName/Id1+Id2+Id3+Id4 и т. Д.

и обрабатывать его в коде следующим образом:

public ActionResult MyActionName(string[] ids)
{
  return View(ids);
}

Ответы [ 2 ]

8 голосов
/ 24 декабря 2011

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

public class StringModelBinder : DefaultModelBinder
{
    public override object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext)
    {
        var value = bindingContext.ValueProvider.GetValue(bindingContext.ModelName);
        if (value != null && !string.IsNullOrEmpty(value.AttemptedValue))
        {
            return value.AttemptedValue.Split(' ');
        }
        return base.BindModel(controllerContext, bindingContext);
    }
}

, а затем либо зарегистрировать его глобально для типа string[], либо использовать атрибут ModelBinder:

public ActionResult MyActionName(
    [ModelBinder(typeof(StringModelBinder))] string[] ids
)
{
    return View(ids);
}

Очевидно, что если вы хотите использовать URL-адрес вида /MyControllerName/MyActionName/Id1+Id2+Id3+Id4, который будет связывать последнюю часть в качестве параметра действия с именем ids, вам придется изменить определение маршрута по умолчанию, которое использует {id}.

0 голосов
/ 01 апреля 2012

После всего выбрал следующее решение:

    public ActionResult Action(string id = "")
    {
        var ids = ParseIds(id);

        return View(ids);
    }

    private static int[] ParseIds(string idsString)
    {
        idsString = idsString ?? string.Empty;

        var idsStrings = idsString.Split(new[] { ' ', '+' });

        var ids = new List<int>();

        foreach (var idString in idsStrings)
        {
            int id;

            if (!int.TryParse(idString, out id))
                continue;

            if (!ids.Contains(id))
                ids.Add(id);
        }

        return ids.ToArray();
    }
...