ASP.NET MVC UpdateModel с полем ввода сложных данных - PullRequest
9 голосов
/ 12 ноября 2008

как мне сделать следующее с ASP.NET MVC UpdateModel? Я пытаюсь прочитать данные в текстовом поле, разделенном пробелами (точно так же, как текстовое поле TAGS в новом вопросе StackOverflow, например, таком), в модель.

например.

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

Свойство Tags действительно создается, но оно содержит только один элемент, который является полными данными, которые были введены в поле ввода Тегов. Если я хочу, чтобы в списке был один элемент (основанный на разделении строки через пробел) ... как лучше всего справиться с этим, пожалуйста?

ура!

1 Ответ

8 голосов
/ 12 ноября 2008

Что вам нужно сделать, это расширить DefaultValueProvider на ваш собственный. В вашем поставщике значений расширьте GetValue (имя), чтобы разделить теги и загрузить в свой LazyList. Вам также необходимо изменить ваш вызов на UpdateModel:

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

Вопрос ValueProvider, который я написал:

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

Надеюсь, это поможет

...