2008-11-12 8 views
9

Comment effectuer les opérations suivantes avec un ASP.NET MVC UpdateModel? J'essaie de lire dans un espace des données de zone de texte délimitées (exactement comme la zone de texte TAGS dans une nouvelle question StackOverflow, comme ceci) dans le modèle.ASP.NET MVC UpdateModel avec un champ de saisie de données complexe sorta

par ex.

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

la propriété Tags ne se laisse instancié, mais il ne contient qu'un seul élément, qui est l'ensemble des données qui a été entrée dans le champ de saisie Tags. Si je veux avoir un seul article dans la liste (basé sur le fractionnement de la chaîne via l'espace) .. quelle est la meilleure pratique à gérer cela, s'il vous plaît?

bravo!

Répondre

8

Ce que vous devez faire est d'étendre le DefaultValueProvider dans le vôtre. Dans votre fournisseur de valeur, étendez GetValue (nom) pour diviser les tags et charger dans votre liste LazyList. Vous aurez également besoin de changer votre appel à UpdateModel:

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

Le QuestionValueProvider je l'ai écrit est:

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

Hope this helps

+0

Eh oui! c'est sûr! maintenant je me demande si cela vaut la peine de faire tout cela, au lieu de simplement faire un UpdateModel avec "title" et "body", puis de définir manuellement la propriété Tags, après avoir appelé Request ["Tags"] et scinder cela? –

+0

@John - juste pour continuer ce fil, quand j'ai ajouté le <% = Html.ValidationMessage ("Tags")%> au html, il autocomplote maintenant la zone de texte avec System.Collections.Generic.List'1 [Foo.Models .Marque]. Tout d'abord, c'est une liste paresseuse de chaînes et pas une de mes autres classes Tag personnalisées. Comment puis-je réparer cela? –

+0

Cette solution est-elle maintenant obsolète avec le MVC RC2 actuel? – a7drew