2008-11-12 1 views
9

ASP.NET MVC UpdateModel을 사용하여 어떻게 수행합니까? 나는 공간으로 구분 된 텍스트 상자의 데이터를 읽으려고하고있다. (정확하게이 새로운 StackOverflow 질문의 TAGS 텍스트 상자와 같다.) 모델에 넣는다.복잡한 데이터 입력 필드가있는 ASP.NET MVC UpdateModel

예 :

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

태그 속성은 인스턴스화되지만 태그 입력 필드에 입력 된 전체 데이터 인 하나의 항목 만 포함합니다. 목록에서 하나의 항목을 원한다면 (스페이스를 통해 문자열을 나눌 때를 기준으로) 최선의 방법은 무엇입니까?

건배!

답변

8

당신이해야 할 일은 DefaultValueProvider를 자신의 것으로 확장하는 것입니다. 당신의 가치 제공 업체에서 GetValue (name)를 확장하여 태그를 분리하고 LazyList에로드하십시오. 또한 UpdateModel에 전화를 변경해야합니다 :

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

내가 쓴 QuestionValueProvider은 다음과 같습니다

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

희망이

+0

네 도움이! 물론 있지! 이제는 내가 그 일을할만한 가치가 있는지 궁금하네요. 단순히 "title"과 "body"로 UpdateModel을 수행하고, 수동으로 Tags 속성을 설정하고 Request [ "Tags"]를 호출하고 나눕니다. –

+0

@ 존 -이 스레드를 계속하기 위해, <% = Html.ValidationMessage ("Tags") %>를 html에 추가하면 이제는 System.Collections.Generic.List'1 [Foo.Models .꼬리표]. 첫째, 문자열 지연 목록이고 다른 사용자 정의 태그 클래스 중 하나가 아닙니다. 이 문제를 어떻게 해결할 수 있습니까? –

+0

현재 솔루션은 현재 MVC RC2와 구식입니까? – a7drew