2008-11-12 12 views
9

¿cómo hago lo siguiente, con un ASP.NET MVC UpdateModel? Intento leer en el espacio datos textuales delimitados (exactamente como el cuadro de texto de TAGS en una nueva pregunta de StackOverflow, como este) en el modelo.ASP.NET MVC UpdateModel con un campo de entrada de datos sorta complejo

por ejemplo.

<input type="Tags" type="text" id="Tags" name="Tags"/> 

... 

public class Question 
{ 
    public string Title { get; set; } 
    public string Body { get; set; } 
    public LazyList<string> Tags { get; set; } 
} 

.... 

var question = new Question(); 
this.UpdateModel(question, new [] { "Title", "Body", "Tags" }); 

las etiquetas de propiedad pone instanciado, pero contiene sólo un elemento, que es toda la información que se ha introducido en el campo de las etiquetas de entrada. Si quiero tener un solo elemento en la lista (basado en dividir la cadena a través del espacio) ... ¿cuál es la mejor práctica para manejar esto, por favor?

¡salud!

Respuesta

8

Lo que necesita hacer es extender DefaultValueProvider al suyo. En su proveedor de valor, extienda GetValue (nombre) para dividir las etiquetas y cargarlas en su LazyList. También tendrá que cambiar su llamada a UpdateModel:

UpdateModel(q, new[] { "Title", "Body", "Tags" }, 
    new QuestionValueProvider(this.ControllerContext)); 

El QuestionValueProvider escribí es:

public class QuestionValueProvider : DefaultValueProvider 
    { 
     public QuestionValueProvider(ControllerContext controllerContext) 
      : base(controllerContext) 
     { 
     } 
     public override ValueProviderResult GetValue(string name) 
     { 
      ValueProviderResult value = base.GetValue(name); 
      if (name == "Tags") 
      { 
       List<string> tags = new List<string>(); 
       string[] splits = value.AttemptedValue.Split(' '); 
       foreach (string t in splits) 
        tags.Add(t); 

       value = new ValueProviderResult(tags, null, value.Culture); 
      } 
      return value; 
     } 
    } 

Esperanza esto ayuda

+0

sip! ¡seguro que lo hace! ahora me pregunto si vale la pena hacer todo eso, en lugar de simplemente hacer un UpdateModel con "title" y "body", luego establecer manualmente la propiedad Tags, después de llamar a Request ["Tags"] y dividir eso? –

+0

@John - solo para continuar este hilo, cuando agregué el <% = Html.ValidationMessage ("Tags")%> al html, ahora autocompleta el cuadro de texto con System.Collections.Generic.List'1 [Foo.Models .Etiqueta]. En primer lugar, es una lista de cadenas perezosas y no una de mis otras clases de etiquetas personalizadas. ¿Cómo puedo arreglar esto? –

+0

¿Está esta solución ahora desactualizada con el MVC RC2 actual? – a7drew

Cuestiones relacionadas