Не может получить ViewModel частичного просмотра cshtml

84
14

У меня есть PartialView на индексной странице следующим образом: -


@{ Html.RenderPartial("ImageUpload"); }

а PartialView выглядит так: -


@model MvcCommons.ViewModels.ImageModel

<p>
@Html.ActionLink("Create New", "Create")
</p>
<table>
@foreach (var item in Model) {
<tr>
<td>
@Html.DisplayFor(modelItem => item.FileName)
</td>
<td>
@Html.DisplayFor(modelItem => item.Description)
</td>
</tr>
}
</table>


Теперь, согласно объявлению в верхней части PartialView, он должен войти в ViewModels.ImageModel, и внутри этого класса у меня есть конструктор: -


public ImageModel()
{
XDocument imageMetaData = XDocument.Load(uploadsDir + @"/ImagesMetaData.xml");
var images = from image in imageMetaData.Descendants("image")
select new Image(image.Element("filename").Value,
image.Element("description").Value);
this.AddRange(images.ToList<Image>());
}

Однако по какой-то причине в частичном представлении ImageUpload, когда я отлаживаю, я не перенаправляюсь к этому конструктору ViewModel, и поэтому модель внутри PartialView имеет значение null.


Я что-то пропустил?


Как я могу получить его на самом деле через мой конструктор? Мне также нужно сделать @model на главной странице индекса (где размещается PartialView).


Спасибо за помощь и время

спросил(а) 2012-06-01T13:01:00+04:00 8 лет, 4 месяца назад
1
Решение
91

Строка @model MvcCommons.ViewModels.ImageModel используется для объявления сильно типизированной модели, но не для нее.


Вы должны использовать


@{ Html.RenderPartial("ImageUpload", <yourmodel>); }

или более просто:


@Html.Partial("ImageUpload", <yourmodel>)

Кстати, в вашем случае:


@Html.Partial("ImageUpload", new ImageModel())

Но осторожно: ваша модель должна быть меньше конструктора, а не загрузки/разбора XML. Это должно быть сделано в контроллере (и задано в системе кэширования?).


Если вы хотите, чтобы ваше основное представление Model было меньше, вы также можете создать Action с атрибутом ChildActionOnly для частичного рендеринга и вызвать его с помощью @Html.Action(...): он создает новый ControllerContext.

ответил(а) 2012-06-01T13:22:00+04:00 8 лет, 4 месяца назад
81

Вы не устанавливаете модель частичного представления. См. http://msdn.microsoft.com/en-us/library/dd492962.aspx


@{ Html.RenderPartial("ImageUpload", myModel); }

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

ответил(а) 2012-06-01T13:07:00+04:00 8 лет, 4 месяца назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема