2011-12-24 9 views

Odpowiedz

0

Ostatecznie wybrano następujące rozwiązanie:

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(); 
    } 
8

+ jest zarezerwowanym symbolem w adresie URL. Oznacza to białą przestrzeń. Tak, aby osiągnąć to, czego szukasz można napisać niestandardowy modelu Spoiwo:

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); 
    } 
} 

a następnie albo zarejestrować go globalnie dla typu string[] lub użyć atrybutu ModelBinder:

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

Oczywiście jeśli chcesz aby użyć adresu URL formularza /MyControllerName/MyActionName/Id1+Id2+Id3+Id4, który będzie wiązał ostatnią część jako parametr działania o nazwie ids, będziesz musiał zmodyfikować domyślną definicję trasy, która używa {id}.

+1

niesamowita odpowiedź darin, naprawdę myślałem, że to niemożliwe! – gideon

Powiązane problemy