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 не было привязано, но Lastname имеет.

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

Наконец, где проблема? Сериализация? Модель привязки? Конвертер? Я не знаю, куда идти. Нет ошибки или исключения.

Любые идеи? Thanks

+0

Вы на самом деле не сказал, что проблема вы столкнулись? С чем вы столкнулись? – Oliver

+0

попробуйте @ Html.EditorFor() вместо TextBoxFor. Что вы видите в Фидлере, когда отправляете форму? все необходимые данные проходят? – 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 value = new ShortStrOra(values[propertyDescriptor.Name]); 

Без него двигатель выбрасывает CastException, когда пытается установить значение строки на мой тип ShortStrOra, но она умирает тихо и нулевое значение установленный на свойстве.

Чтобы использовать пользовательскую модель связующего в контроллере:

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

У меня был проект с аналогичной проблемой, однако вышеописанное решение связывало только мои пользовательские структуры на модели верхнего уровня; рекурсия в более глубокие модели попадает в другое в ваше решение, а связующее устройство по умолчанию не обрабатывает рассматриваемые структуры. В то время как ваше решение помогло мне ориентироваться на модельное связующее, http://stackoverflow.com/a/6861616/595473 закончил решение этой проблемы на моем сайте для использования форм и запросов. – CosworthTC