2013-08-20 2 views
1

Я начал создавать свой контроллер для родительской модели, указанной ниже. Я использую модели просмотра для всех своих взглядов, но прежде чем я перешел к добавлению логики для действия Create (Post), я просто нажал submit для черта, думая, что моя модель просмотра не будет сопоставляться с моей моделью.MVC4 Автоматически отображает мою модель представления?

К моему удивлению, это действительно сработало. Я использую AutoMapper и настроил все сопоставления для дочерних моделей на соответствующие модели, но не на родительскую модель (как отсутствие в результатах сообщения). Что происходит здесь, когда MVC разрешает такую ​​магию?

Модель:

public partial class ParentModel 
    { 
     public int Id { get; set; } 
     public int Child1Id { get; set; } 
     public int Child2Id { get; set; } 
     public int Child3Id { get; set; } 
     public int Child4Id { get; set; } 
     //other data 
     public virtual Child1 Child1 { get; set; } 
     public virtual Child2 Child2 { get; set; } 
     public virtual Child3 Child3 { get; set; } 
     public virtual Child4 Child4 { get; set; } 
    } 

вид Модель:

public class ParentCreateViewModel 
    { 
     //other data 
     public Child1ViewModel Child1 { get; set; } 
     public Child2ViewModel Child2 { get; set; } 
     public Child3ViewModel Child3 { get; set; } 
     public Child4ViewModel Child4 { get; set; } 
    } 

View (Create.cshtml):

@model Project.ViewModels.ParentCreateViewModel 
@*EditorTemplates and such*@ 

Controller (Получить):

public ActionResult Create() 
    { 
     //some list logic 
     return View(); 
    } 

Controller (Post - я еще не изменил его на ParentCreateViewModel или AutoMapped его обратно ParentModel):

[HttpPost] 
[ValidateAntiForgeryToken] 
public ActionResult Create(ParentModel parentModel) 
{ 
    if (ModelState.IsValid) 
    { 
     db.ParentModels.Add(parentModel); 
     db.SaveChanges(); 
     return RedirectToAction("Index"); 
    } 

    //some list logic 
    return View(parentModel); 
} 

Моя материнская модель и все дочерние модели правильно сохраняется в базе данных. MVC делает что-то за привязкой сцены? Разве не следует ожидать ParentCreateViewModel?

ответ

4

Связующее устройство по умолчанию связывается с именем элементов. Поскольку обе модели будут делиться этими свойствами (и, следовательно, именами HTML-элементов при использовании шаблонов редакторов и HTML-помощников), он привяжет его к модели.

Обе ваши модели будут генерировать элементы формы, как это:

<input type="text" name="Child1_Name" /> 

..etc. Когда значения формы отправляются, связующее устройство проверяет и находит «Child1_Name». Подчеркивание означает свойство дочернего класса. Таким образом, неважно, какую модель вы выберете, потому что Child1.Name является допустимым свойством обеих моделей. Итак, поскольку вы сказали, что метод действия вы хотите ParentModel, связующее устройство с удовольствием применяет значение к свойству Child1.Name, когда оно будет найдено.

+0

Если представление возвращается, ParentCreateViewModel не должен обрабатывать метод Create Post, когда он получает это, в отличие от ParentModel? Или происходит отображение, когда представление передается в сообщение, а не на db.ParentModels.Add (parentModel)? – Xaxum

+2

+1 Чтобы добавить к этому ответу, ваше представление (которое здесь не показано) будет состоять из формы, которая HTTP POST возвращает поля на веб-сервер. Порекомендуйте ознакомиться с запросом с помощью [fiddler] (http://fiddler2.com/), чтобы получить представление о том, что отправляется обратно. Данные запроса HTTP будут проверяться связующим веществом модели MVC по умолчанию, которое попытается создать экземпляр типа модели, определенный в методе действий, заполняя сопоставимые свойства с помощью значений запроса. – SteveChapman

+0

@chappoo спасибо за разъяснение, где происходит отображение. – Xaxum

Смежные вопросы