2011-02-10 2 views
1

Возможно ли (и как) отправлять почтовый запрос с массивом, хранящимся в одном параметре? какASP.Net MVC: отправить массив/коллекцию одним параметром

myStringArray = привет, мир

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

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

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

Спасибо

+0

Не будет ли это myStringArray = hello & myStringArray = world? –

+0

Если это не часть фактической формы, я бы просто использовал ViewModel – Cyberdrew

ответ

3

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

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

Тогда вам не нужен параметр массива, просто разделить строку через запятую в массив:

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

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

0

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

2

Это 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; 
    } 
Смежные вопросы