2011-12-24 12 views

Respuesta

0

Después de todo eligieron la siguiente solución:

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

+ es un símbolo reservado en una url. Significa espacio en blanco. Así que para lograr lo que busca se podría escribir un modelo personalizado de aglutinante:

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

y luego o registrarlo a nivel mundial para el tipo string[] o utilizar el atributo ModelBinder:

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

Obviamente, si usted quiere para usar una url del formulario /MyControllerName/MyActionName/Id1+Id2+Id3+Id4 que enlazará la última parte como un parámetro de acción llamado ids, deberá modificar la definición de ruta predeterminada que usa {id}.

+1

respuesta increíble darin, ¡realmente pensé que esto no era posible! – gideon

Cuestiones relacionadas