ASP.Net MVC: отправить массив / коллекцию в одном параметре - PullRequest
1 голос
/ 10 февраля 2011

Можно ли (и как) отправить почтовый запрос с массивом, хранящимся в одном параметре?как

myStringArray = hello, world

и действие, которое принимает этот параметр как массив с , в качестве разделителя

public ActionResult MyAction(string[] myStringArray)
{
  //myStringArray[0] == "hello" and myStringArray[1] == "world"
}

Формат параметра myStringArray не имеет значения.Но это должен быть один параметр.

Спасибо

Ответы [ 3 ]

3 голосов
/ 10 февраля 2011

Зависит от того, как вы отправляете данные на сервер.Если вы делаете это из URL-параметра или обычного текстового поля, содержащего такие данные, как:

<input id="myString" name="myString" type="text" value="hello,world" />

Тогда вам не нужен параметр массива, просто разбейте строку запятыми на массив:

public ActionResult MyAction(string myString)
{
    string[] myStringArray = myString.Split(',');
}

Но если вы отправляете это через AJAX, вы также отправляете это напрямую.Если вы хотите отправить реальный массив, тогда ваш javascript должен выглядеть следующим образом answer .

2 голосов
/ 10 февраля 2011

Вот IModelBinder, который я использовал для этого сценария.

    public class DelimitedArrayModelBinder : IModelBinder
    {
        public DelimitedArrayModelBinder()
            : this(null)
        {
        }

        public DelimitedArrayModelBinder(params string[] delimiters)
        {
            m_delimiters = delimiters != null && delimiters.Any()
                ? delimiters
                : new[] { "," };
        }

        public object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext)
        {
            // type must be an array
            if (!bindingContext.ModelType.IsArray)
                return null;

            // array must have a type
            Type elementType = bindingContext.ModelType.GetElementType();
            if (elementType == null)
                return null;

            // value must exist
            ValueProviderResult valueProviderResult = bindingContext.ValueProvider.GetValue(bindingContext.ModelName);
            if (valueProviderResult == null)
                return null;

            string strValue = valueProviderResult.AttemptedValue;
            if (string.IsNullOrEmpty(strValue))
                return null;

            List<object> items = new List<object>();
            foreach (string strItem in strValue.Split(m_delimiters, StringSplitOptions.RemoveEmptyEntries))
            {
                try
                {
                    object item = Convert.ChangeType(strItem, elementType);
                    items.Add(item);
                }
                catch (Exception)
                {
                  // if we can't convert then ignore or log
                }
            }

            // convert the list of items to the proper array type.
            Array result = Array.CreateInstance(elementType, items.Count);
            for (int i = 0; i < items.Count; i++)
                result.SetValue(items[i], i);

            return result;
        }

        private readonly string[] m_delimiters;
    }
0 голосов
/ 10 февраля 2011

Если вы создадите модель с массивом, у вас не должно возникнуть никаких проблем. Тогда, конечно, вам нужно представление, которое будет использовать этот строгий тип (нажмите «Создать строго типизированное представление» и найдите вашу модель представления, которую вы только что создали в списке), у вас не должно возникнуть проблем.

...