У меня есть следующие доменные объекты:
public class Foo
{
public Id {get; set;}
**public BarId {get; set;}**
public virtual Bar {get; set;}
public string Name {get; set;}
}
public class Bar
{
public Id {get; set;}
public string Name {get; set;}
}
Модель вида, используемая видом, выглядит следующим образом:
public class FooEditorModel
{
public Foo {set; get;}
public SelectList Bars { get; set; }
}
Вид выглядит так:
@model FooEditorModel
@Html.ValidationSummary( true )
@Html.HiddenFor( model => model.Foo.Id )
@Html.LabelFor( model => model.Foo.BarId, "Bar" )
@Html.DropDownListFor( model => model.Foo.BarId, Model.Bars )
@Html.ValidationMessageFor( model => model.Foo.BarId )
Контроллер выглядит так:
[HttpPost]
public virtual ActionResult Save( FooEditorModel model )
{
if ( ModelState.IsValid )
{
Foo foo = MakeAModel( model );
FooRepository.Save( foo );
}
}
Foo MakeAModel( model )
{
Foo foo = MakeAFoo();
**foo.BarId = model.Foo.BarId;**
return foo;
}
Довольно стандартный код, немного упрощенный.
Проблема в том, что если я использую Bar в Foo, вместо BarId , ModelState будет недействительным (из-за Bar.Name).
Я считаю, что он очень плохо спроектирован, чтобы иметь принудительный идентификатор ребенка и ссылку на ребенка в корневом объекте.
Это единственный способ для привязки данных работать в MS MVC 3?