2012-01-13 2 views
2

У меня есть модель заказа (как показано ниже)MVC3 модель вместо модель ... не может видеть при отправке в контроллер

public class Order 
    { 
     //[Key] 
     [ScaffoldColumn(false)] 
     public int OrderId { get; set; } 

     [DisplayName("Order Date")] 
     public DateTime OrderDate { get; set; } 

     public virtual ProductSelection ProductSelection { get; set; } 

     public virtual ShippingDetails ShippingDetails { get; set; } 

     public virtual BillingDetails BillingDetails { get; set; } 

     public virtual CardDetails CardDetails { get; set; } 

     public virtual AccountUser AccountUsers { get; set; } 
    } 

Как вы можете видеть, состоит из множества других моделей, например ProductSelection (показано ниже).

public class ProductSelection 
    { 
     public int SimulatorId { get; set; } 

     public string VersionNumber { get; set; } 

     [DisplayName("Quantity")] 
     public int Quantity { get; set; } 

     [DisplayName("Total Price")] 
     [ScaffoldColumn(false)] 
     public decimal TotalPrice { get; set; } 
    } 

Проблема, которую я имею, когда я отправляю к контроллеру, который имеет параметр порядка, я не могу получить какой-либо из значений суб-моделей (например Order.ProductSelection.SimulatorId.)

Любые идеи, почему это не работает, поскольку в настоящее время я использую FormCollection, который не является идеальным и более беспорядочным.

С нетерпением жду ответов

Steve

+0

Возможно, это глупый вопрос, но почему ваши дочерние объекты обозначены как «виртуальные»? – tobias86

+0

Не уверен, должны ли они быть отмечены как общедоступные? – swade1987

+0

Возможно, попробуйте сделать их просто «публичными». Я мог бы выйти на конечность, сказав, что это может повлиять на то, как ModelBinder связывает ваши опубликованные данные с аргументом Action. – tobias86

ответ

0

Вы должны применять ForeignAttribute на ProductSelection имущество, которое указывает на первичный ключ ProductSelection класса:

[ForeignKey("SimulatorId")] 
public virtual ProductSelection ProductSelection { get; set; } 

Надежда, что помогает.

+0

Вы можете заменить ForeignKeyAttribute на RequiredAttribute, который помечает отношение по мере необходимости и генерирует ON DELETE CASCADE в базе данных. –

+0

Я попробую это сейчас :) – swade1987

+0

Что же такое атрибут SimulatorId в каждой подмодуле, а затем использовать ForeignKey для каждой из моделей в заказе? – swade1987

1

1) Глупый вопрос, но только для того, чтобы быть уверенным. Сохраняете ли вы значения вашей подмодели на виду (в форме, как скрытой или любой другой тип ввода, убедитесь, что имя вашего скрытого типа совпадает с вашим имя свойства в модели) или в строке запроса. Перед тем, как предоставить вам полностью загруженную модель, связующее устройство моделирует различные места, чтобы загрузить вашу модель, например, вашу коллекцию форм, данные маршрута и строку запроса Если вы не сохраняете их ни в одном из этих мест, тогда связующее устройство не сможет найти эти значения и дать вам загруженные значения для действия контроллера.
Основы .. http://dotnetslackers.com/articles/aspnet/Understanding-ASP-NET-MVC-Model-Binding.aspx

2) Ваш пример модель выглядит хорошо, но убедитесь, что все свойства модели к югу имеют модификатор общего доступа, и они должны быть установлены в их имущественной декларации. ---> У меня была такая же проблема, потому что у меня был модификатор частного доступа для набора этих свойств, и я потратил весь день на то, чтобы понять это.

3) Если ничего не работает (надеюсь, что это не так), то, наконец, вы можете написать свое собственное связующее устройство. Вот хороший пост, если вы решили голову в этом направлении http://buildstarted.com/2010/09/12/custom-model-binders-in-mvc-3-with-imodelbinder/

Это мой первый пост (под мой счет) и он чувствует себя очень хорошо, чтобы участвовать .. !!

+0

Еще одна ссылка .. http://forums.asp.net/p/1559541/3846605.aspx (Глупый .. !! SO не позволил мне добавить более 2 ссылок.) –

+0

Hi Amit, Многие спасибо за подробный ответ. Что касается представлений, у меня есть файл Order \ Index.cshtml, который выполнен из аккордеона JQuery, каждый раздел содержит частичный вид (состоящий из определенной подмодели Eg ProductSelection) Поэтому мне нужно сохранить все значения (субмодулей) как скрытые поля в файле Order \ Index.cshtml, а затем я смогу получить к ним доступ в контроллере, используя Order.ProductSelection.Quantity. – swade1987

+0

Вам необязательно хранить все значения в Index.cshtml. Если вы передаете вспомогательную модель в частичных, вы можете сохранить их как скрытые в ваших частицах и сделать частичными внутри вашей формы. Таким образом, у вас будет больше читаемости в ваших представлениях. –

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

  • Нет связанных вопросов^_^