2011-12-24 5 views

risposta

0

Dopo tutto ha scelto la seguente soluzione:

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

+ è un simbolo riservato in un URL. Significa spazio bianco. Quindi, per ottenere ciò che si sta cercando si potrebbe scrivere un modello personalizzato legante:

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

e poi o registrarlo a livello globale per il tipo string[] o utilizzare l'attributo ModelBinder:

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

Ovviamente se si vuole per utilizzare un url del modulo /MyControllerName/MyActionName/Id1+Id2+Id3+Id4 che vincolerà l'ultima parte come parametro di azione denominato ids, sarà necessario modificare la definizione di instradamento predefinita che utilizza {id}.

+1

sorprendente risposta darin, ho davvero pensato che non fosse possibile! – gideon

Problemi correlati