2012-06-06 1 views
2

У меня есть следующие настройкиMVC модель привязки сохраняющиеся Сложные свойства на модели

public class Profile 
{ 
    //Some Properties 

    //Some Methods 
} 

/*Model Class*/ 
public class LineItem 
{ 
    public Profile Profile {get;set;} 
} 

В моем контроллере. У меня есть две следующие действия

public ActionResult GetRequest(){ 

    LineItem model = new LineItem(); 
    model.Profile = new Profile(){/*Initialize Properties*/}; 
    return View(model); 
} 

public ActionResult PostRequest(LineItem item(){ 
     item.Profile .... /*Profile Is Null*/ 
     return View(...); 
} 

Я проверил, что свойство профиля на классе LineItem модель устанавливается на GetRequest, и вернулся к представлению, но я хочу знать, как сохранить это комплексное свойство, когда это модель представлена. Я знаю, что люди обычно используют скрытые поля для устойчивости модели и что сеанс также доступен, но кажется, что я должен иногда указывать ModelBinder (возможно, через атрибут или аннотацию) для сохранения сложных свойств в моей модели.

Как это можно сделать?

+1

Вы пытались создать настраиваемое связующее устройство, которое реализует интерфейс IModelBinder? –

+1

По умолчанию 'ModelBinder' будет устанавливать любое свойство, соответствующее параметру POST. Поэтому, если у вас нет элемента ввода для определенного свойства, он не будет сохраняться между GET/POST. – jrummell

+0

Я планировал это сделать, но я хочу определить способ сделать этот процесс достаточно прозрачным. Спасибо за помощь. – TheJediCowboy

ответ

3

Вы можете использовать @Html.HiddenFor(model => model.Profile.Id)@Html.HiddenFor(model => model.Profile.Name) и т. Д. Для каждого свойства Model.Profile, который необходимо сохранить. Вы не должны касаться модельного связующего - он будет автоматически привязан с помощью стандартного связующего. Если вы используете другие html-помощники, которые генерируют теги ввода для некоторого свойства - вы не должны использовать @Html.HiddenFor() для этого свойства.

+0

это не сработает, если вы посмотрите на мой вопрос, я не беспокоюсь конкретно об Идентике, я беспокоюсь обо всем свойстве Profile. Если бы я использовал этот метод, мне нужно было бы предоставить скрытый ввод для каждого свойства, что не очень практично для больших сложных объектов. – TheJediCowboy

+1

Если это проблема, вы можете написать свою собственную логику сериализации для класса профиля, использовать скрытое поле для хранения этой сериализации и создать свое собственное связующее устройство для этого класса для десериализации скрытого поля в свойства. НО это выглядит как ViewState в webforms. Подумайте о том, что ваш класс профиля слишком усложнен для выполнения всей этой работы, и вам нужно повторно использовать это решение для других классов. Использование N-time Html. Скрытый вызов более простой. –