asp.net mvc строка привязки к ienumerable <int> - PullRequest
1 голос
/ 07 октября 2009

просто интересно, есть ли что-то встроенное в asp.net mvc, где я могу переопределить привязку определенного члена.

Например, представьте, что у меня есть форма:

<form ...>
  <input type="text" name="Things" />
  ...
</form>

И у меня есть действие контроллера, которое обрабатывает обратную передачу:

public ActionResult MyPostbackAction(IEnumerable<int> things)
{
  ...
}

и введите в поле следующие данные: «1, 20, 30, 50» (не включая кавычки).

Конечно, это не сработает, как именно это действие предназначено для преобразования строки в последовательность целых чисел? поэтому я хочу быть в состоянии «намекнуть» связующему, как я ожидаю, что оно свяжет это значение .. что-то вроде:

public ActionResult MyPostbackAction([SequenceBinder(",")]IEnumerable<int> things)
{
  ...
}

Где связыватель последовательности является подсказкой связывания, которая разбивает входящее значение разделителем и делегирует привязку обратно инфраструктуре связывания, чтобы он мог обрабатывать связывание последовательности строк в IEnumerable.

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

Просто интересно, существует ли оно уже, встроено или сообществом.

Заранее спасибо, Стивен.

Ответы [ 2 ]

3 голосов
/ 07 октября 2009

Насколько я знаю, единственный способ, которым вы можете сделать это, - создать пользовательский механизм связывания, реализовав интерфейс IModelBinder.

Пример (один из многих) см. http://davidhayden.com/blog/dave/archive/2008/09/08/CustomModelBinderMoreUIValidationASPNETMVC.aspx

Не забудьте зарегистрировать его в global.asax

РЕДАКТИРОВАТЬ: Принимая во внимание ваш комментарий ниже, вы можете привязать поле как обычно, а затем обработать фильтр действий для обработки.

[ProcessField]
public ActionResult MyPostbackAction([Bind(Exclude="IEnumerableField")] ViewModel data) {
    ...
}

Я исключаю поле IEnumerable, которое будет в модели, поэтому оно не может быть привязано автоматически, если кто-то изменил запрос POST.

Фильтр действий затем может позаботиться о выполнении работы по синтаксическому анализу строки в IEnumerable.

2 голосов
/ 08 октября 2009

Если вы хотите избежать написания своего собственного пользовательского связывателя модели, вы можете прибегнуть к «псевдо-свойству», чтобы заставить DefaultModelBinder делать то, что вы хотите. Например,

public class SomeEntity
{
    private List<int> _Things;
    public IEnumerable<int> Things
    {
        get { return _Things; }
    }
    public string MvcThings
    {
        set
        {
            _Things = value
                        .Split(',')
                        .Select(e => int.Parse(e.Trim()))
                        .ToList();
        }
        get
        {
            return String.Join(", ",
                _Things.Select(e => e.ToString()).ToArray());
        }
    }
}

Затем вы можете ссылаться на MvcThings (в виде строки, разделенной запятыми) в поле формы HTML и параметре метода действия. С другой стороны, ваша модель может работать с предпочтительным значением IEnumerable<int>. Обратите внимание, что мой конкретный LINQ может быть не самым элегантным, но это должно дать вам идею. Вы также хотели бы ожидать исключения в int.Parse, но это может быть дополнительно проверено / уточнено по мере необходимости.

Удачи!

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