2008-11-12 19 views
9

ASP.NET MVC UpdateModel ile aşağıdakileri nasıl yaparım? Modele boş bir metin kutusu verisini (tıpkı yeni bir StackOverflow sorusundaki TAGS metin kutusunun aynısı gibi) okumaya çalışıyorum. Örn.,ASP.NET MVC UpdateModel bir sorta karmaşık veri giriş alanına sahip

örn.

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

Etiketler mülkiyet

örneği almak yok, ama Etiketler giriş alanına girilen tüm veriler yalnızca bir öğe içerir. Listede tek bir öğeye sahip olmak istiyorsam (dizgiyi alan üzerinden bölme esasına dayanarak) .. en iyi uygulama hangisidir, lütfen?

Şerefe!

cevap

8

Yapmanız gereken, DefaultValueProvider'ı kendi başınıza genişletmektir. Değer sağlayıcınız, etiketleri bölmek ve LazyList'inize yüklemek için GetValue (isim) 'i genişletir. Ayrıca UpdateModel için çağrı değiştirmeniz gerekecektir:

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

Yazdığım QuestionValueProvider geçerli:

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

Umut bu

+0

yep yardımcı olur! Tabii ki yapar! şimdi "Başlık" ve "Gövde" ile bir UpdateModel yapmak yerine tüm bunları yapmaya değip değmeyeceğini merak ediyorum. Daha sonra İstekler ["Etiketler"] 'i arayarak ve bunu böldükten sonra Etiketler özelliğini manuel olarak ayarlayarak mı? –

+0

@John - Sadece <% = Html.ValidationMessage ("Etiketler")%> öğesini html'ye eklediğimde, bu iş parçacığı devam etmek için, şimdi System.Collections.Generic.List'1 [Foo.Models ile metin kutusunu otomatik olarak tamamlar. .Etiket]. İlk olarak, bu bir dize tembel listesi ve diğer özel Tag sınıflarımdan biri değil. Bunu nasıl düzeltebilirim? –

+0

Bu çözüm şu andaki MVC RC2 ile güncel değil mi? – a7drew