3

나는 다음과 같은 시나리오가 : C#을 기본 프로젝트, 회사의 다른 모든 프로젝트에서 사용하는 모든 데이터 도메인 (사용자 정의 유형)로한다. 그래서 약간 수정하기가 어렵습니다.MVC 사용자 정의 형 속성은 내 모델에 바인딩되지

이제, 우리는 참고로 그 기본 프로젝트와 우리의 첫 MVC 프로젝트를 생성하고,이 모델은 사용자 정의하는 문자열 속성 유형 나던 작업을 바인딩 :

[Serializable] 
    [TypeConverter(typeof(ShortStrOraTypeConverter))] 
    public class ShortStrOra : BaseString 
    { 
     public ShortStrOra() 
      : this(String.Empty) 
     {   
     } 

     public ShortStrOra(string stringValue) 
      : base(stringValue, 35) 
     { 
     } 

     public static implicit operator ShortStrOra(string stringValue) 
     { 
      return new ShortStrOra(stringValue); 
     } 

     public static implicit operator string(ShortStrOra value) 
     { 

      if (value == null) 
      { 
       return null; 
      } 
      else 
      { 
       return value.ToString(); 
      } 
     } 

     public void Add(object o) 
     { 
     } 
    } 

TypeConverter가 :

public class ShortStrOraTypeConverter : TypeConverter 
    { 
     public override bool CanConvertFrom(ITypeDescriptorContext context, Type sourceType) 
     { 
      if (sourceType == typeof(string)) 
       return true; 
      return base.CanConvertFrom(context, sourceType); 
     } 

     public override object ConvertFrom(ITypeDescriptorContext context, System.Globalization.CultureInfo culture, object value) 
     { 
      if (value is string) 
       return new ShortStrOra(Convert.ToString(value)); 
      return base.ConvertFrom(context, culture, value); 
     } 

     public override object ConvertTo(ITypeDescriptorContext context, System.Globalization.CultureInfo culture, object value, Type destinationType) 
     { 
      if (destinationType == typeof(string)) 
       return ((ShortStrOra)value).ToString(); 

      return base.ConvertTo(context, culture, value, destinationType); 
     } 
    } 

그리고 간단한 테스트에서이 단일 클래스를 사용하면 Name 속성이 바인딩되지 않았지만 성이 있습니다.

public class TesteModel 
{ 

    public ShortStrOra Name {get; set;} 
    public String Lastname { get; set; } 
    public TesteModel() { } 

} 

내보기 :

@using (Html.BeginForm("EditMember", "Home", FormMethod.Post, new { @id = "frmEditMembers" })) 
{ 
    @Html.TextBoxFor(m => m.Name)<br /> 
    @Html.TextBoxFor(m => m.Lastname) 
    <input type="submit" value="Salvar" /> 
} 

내 컨트롤러 :

마지막으로
public ActionResult EditMember(TesteModel model) 
{ 
    return View("Index", model); 
} 

, 문제는? 직렬화? 모델 바인딩? 변환기? 나는 가야할 곳을 모른다. 오류 또는 예외가 없습니다.

모든 ideias? 감사

+0

당신은 실제로 당신이 겪고있는 문제가 무엇 말했다하지 않은 :

컨트롤러에서 사용자 정의 모델 바인더를 사용하려면? 너 무슨 문제있어? – Oliver

+0

TextboxFor 대신 @ Html.EditorFor()를 시도하십시오. 양식을 제출할 때 Fidler에서 무엇을 볼 수 있습니까? 필요한 모든 데이터를 처리하고 있습니까? – trailmax

답변

4

나는 그것을 발견했다. 나는 바인딩 정의 모델에 대해 읽은 다음이 방법 내 문제 해결 : 모델 바인딩 및 속성은 사용자 정의 유형의 경우 검사를 대체 할,

새로운 클래스를 생성하고 다음을 초기화합니다. 문제를 해결 무엇

public class TesteModelBinder2 : DefaultModelBinder 
{ 
    protected override void BindProperty(ControllerContext controllerContext, ModelBindingContext bindingContext, System.ComponentModel.PropertyDescriptor propertyDescriptor) 
    { 
      NameValueCollection values = controllerContext.HttpContext.Request.Form; 

      if (propertyDescriptor.PropertyType.Equals(typeof(ShortStrOra))) 
      { 
       ShortStrOra value = new ShortStrOra(values[propertyDescriptor.Name]); 
       propertyDescriptor.SetValue(bindingContext.Model, value); 
       return; 
      } 
      else 
      base.BindProperty(controllerContext, bindingContext, propertyDescriptor); 
    } 
} 

는이 줄을이었다 내 ShortStrOra 유형에 문자열 값을 설정하려고 할 때 엔진이 CastException를 던졌습니다 없이는

ShortStrOra value = new ShortStrOra(values[propertyDescriptor.Name]); 

하지만 자동으로 죽고 null 값이다 재산에 setted.

[HttpPost] 
public ActionResult EditMember([ModelBinder(typeof(TesteModelBinder2))]TesteModel model) 
    { 
     return View("Index", model); 
    } 
+0

난 단지 최상위 모델에 내 사용자 정의 구조체를 결합 그러나 위의 해결책, 유사한 문제와 프로젝트를했다; 더 깊은 모델로의 재귀가 솔루션의 다른 부분을 강타하고 기본 모델 바인더가 해당 구조체를 처리하지 못했습니다. 솔루션은 모델 바인더, http://stackoverflow.com/a/6861616/595473으로 저를 안내하는 데 도움이 동안 양식 내 사이트를 통해이 문제를 해결하고 사용 사례를 쿼리 문자열 끝났다. – CosworthTC