Поведение .net mvc ViewPage <T1> и ViewUserControl <T2> - PullRequest
0 голосов
/ 16 июня 2009

У меня есть страница просмотра с наследованной частью, похожей на

Inherits="System.Web.Mvc.ViewPage<User>"

и ViewUserControl с частью наследования, похожей на

Inherits="System.Web.Mvc.ViewUserControl<Address>

где класс пользователя (сокращенный) по сути выглядит так:

class User {
public virtual Address address { get; set; }

}

Теперь, если я попытаюсь:

Html.RenderPartial("Address", Model.address);

тогда я потенциально получаю какое-то странное поведение. В моем случае оказывается, что Model.address был нулевым Вместо передачи пустого значения элементу управления, похоже, что фреймворк пытался передать Model (т.е. type = User) и выдавал ошибку (неожиданный тип).

Не принимая во внимание тот факт, что мой адрес был нулевым, это поведение по умолчанию родительского объекта как ошибка, или ожидаемое поведение. Если это ожидаемое поведение, то может кто-нибудь объяснить, почему? Я не понимаю.

Ответы [ 2 ]

1 голос
/ 16 июня 2009

Очень часто такие вопросы приводят к тому, что ОП делает ошибку в другом месте, и ошибка не воспроизводима. Я пытался воссоздать ваш точный сценарий, и что вы знаете? Вы на самом деле правы :) Я создал простое отношение Parent / Child, и у View был тип child, а частично - тип child.Parent, который был нулевым, и я не получил нулевую ссылку, я фактически сделал получить ошибку несоответствия типов. На самом деле, даже если явно передать null в представление:

Html.RenderPartial("MyPartial",null);

или даже с прямым броском:

Html.RenderPartial("MyPartial",(Parent)null);

все равно выдает ошибку несоответствия.

Мой догадка и это действительно общее предположение, что когда он обнаруживает, что передаваемый объект является нулевым, он просто по умолчанию использует модель фактического представления сам. Я не уверен, является ли это намерением или ошибкой, но это единственное, что имеет смысл.

0 голосов
/ 16 июня 2009

Я полагаю , вам следует избегать передачи нулевых моделей вашим представлениям . Используйте модель по умолчанию / пусто, если ваша модель пуста. Это должно работать:

Html.RenderPartial("Address", Model.address ?? new Address { /* OPTIONAL: default values */});
...