2012-08-24 4 views
1

내 뷰 모델에서 속성에 대해 호출 할 사용자 지정 값 공급자를 얻는 데 별 어려움이 없습니다. 사용자 정의 값 공급자를 사용하여 내보기 모델에 UserHostAddress와 같은 일부 표준 요청 데이터를 캡슐화하려고합니다. 나는 내 사용자 지정 값 공급자가 자동으로하여 IPAddress 속성을 채우려형식이 아닌 속성에 대해 ValueProvider가 호출되지 않습니다.

public class MyViewModel 
{ 
    public string Name { get; set; } 

    public string IPAddress { get; set; } 
} 

: 같은

예를 들어, 내보기 모델 보인다. 아쉽게도 GetValue는 해당 속성에 대해 호출되지 않습니다. DefaultModelBinder가 모델의 프로퍼티를 반복 해 값 프로 바이더가 값을 체크한다고 생각했기 때문에 이상하게 보입니다.

+0

사용자 지정 값 공급자 팩토리를 등록 했습니까? – Eranga

+0

나는 같은 문제가 있다고 생각한다. 'GetValue' * only *는 내 요청에 다른 속성이 포함될 때 to-be-populated-property를 호출하는 것처럼 보입니다 (예 : 귀하의 경우 :'name'이 라우트 매개 변수 또는 쿼리 문자열을 통해 전달 될 경우).). 그러나 요청에 매개 변수가 들어 있지 않은 경우에는 적용되지 않습니다. 이 경우 컨트롤러는 MyViewModel에 대해 'null'을받습니다. 'GetValue'는 매개 변수의 이름과 빈 문자열로 호출되지만, 채워지는 속성 (예제에서는'IPAddress')이 아닙니다. 이유와 해결책을 찾았습니까? –

답변

2

사용자 지정 값을 제공 할 수 :

public class MyValueProvider : IValueProvider 
{ 
    public bool ContainsPrefix(string prefix) 
    { 
     return true; 
    } 

    public ValueProviderResult GetValue(string key) 
    { 
     if (key.EndsWith("Name")) 
     { 
      var value = "john"; 
      return new ValueProviderResult(value, value, CultureInfo.InvariantCulture); 
     } 
     else if (key.EndsWith("IPAddress")) 
     { 
      var value = "127.0.0.1"; 
      return new ValueProviderResult(value, value, CultureInfo.InvariantCulture); 
     } 

     return null; 
    } 
} 

및 해당 공장 :

Application_Start에 등록됩니다
public class MyValueProviderFactory : ValueProviderFactory 
{ 
    public override IValueProvider GetValueProvider(ControllerContext controllerContext) 
    { 
     return new MyValueProvider(); 
    } 
} 

:

ValueProviderFactories.Factories.Add(new MyValueProviderFactory()); 

을 지금 당신은 할 수 있습니다 컨트롤러 :

및 전망 :

@model MyViewModel 

@Html.DisplayFor(x => x.Name) 
@Html.DisplayFor(x => x.IPAddress) 

@using (Html.BeginForm()) 
{ 
    <button type="submit">OK</button> 
} 

귀하의 사용자 정의 값 공급자가 기본 모델 바인더에 의해 사용됩니다.

+0

아마도 나는 명확하지 않았습니다. 사용자 지정 값 공급자가 있지만 GetValue 메서드가 호출되지 않았습니다. 답변을 찾았으며 질문을 업데이트 할 것입니다. –

관련 문제