Неверное значение свойства модели, отображаемое в частичном представлении

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

родительская страница просмотра модели извлечения:

public class ParentPageViewModel
{
    public int Id { get; set; } // problem property
    ...
    public IEnumerable<ChildViewModel> Children { get; set; }
}

Child page view model extract:

public class ChildViewModel
{
    public int Id { get; set; } // problem property
    ...
}

выдержка родительской страницы (бритва):

@model ParentPageViewModel
...
@foreach (var item in Model.Children)
{
    @Html.Partial("MyPartialView", item)
}
...

частичный вид выдержка:

@model ChildViewModel
...
<form ...>
    @Html.HiddenFor(m => m.Id) // problem here - get ParentPageViewModel.ID not ChildViewModel.Id
</form>
...

таким образом, в основном в моем выводе, мое скрытое поле имеет значение родительского элемента модели представления, а не значение, переданное частичному представлению. Это определенно вызвано именем, как изменение имени @ChildViewModel.Id@ к чему-то вроде @ChildViewModel.ChildId@ заставляет его работать так, как ожидалось. Интересно, что при проверке значений модели представления в отладчике я вижу правильные значения; это только отображаемый вывод, который неверен.

Is есть способ обойти этот или "правильный" способ сделать то, что я пытаюсь сделать (я рендеринг мини-форм в таблице для проверки ajax/публикации обновлений в строках таблицы)

спасибо,

Тим

4 ответов


Я думаю, что изменение вашего вызова на это решит проблему:

@Html.Partial("MyPartialView", item, new ViewDataDictionary())

дочернее представление получает значение из словаря ViewData-поэтому оно переходит в новом словаре в дочернее представление (hattip danludwig).


Я знаю, это старый пост. Но я подумал, что раз уж я приземлился здесь, когда столкнулся с той же проблемой, я мог бы внести свой вклад. Моя проблема была немного другой. В моем случае идентификатор основного представления был неправильным после частичного действия представления, которое требовало обновления всей страницы/представления. Я решил проблему с ModelState.Ясно!--2-->

ModelState.Clear();
return View("Maintenance", model);  //call main view from partial view action

найдено решение, просто вручную создав скрытое поле, например:

<input type="hidden" name="Id" value="@Model.Id" />

вместо использования Html.HiddenFor.

(Я не буду отмечать это как ответ на некоторое время, если есть какие-либо другие решения или кто-нибудь может объяснить проблему)


создайте файл с именем ChildViewModel.cshtml в Views/Shared / EditorTemplates. Поместите свое частичное представление в этот файл:

in ~/Views/Shared/EditorTemplates / ChildViewModel.cshtml по

@model ChildViewModel
...
<form ...>
    @Html.HiddenFor(m => m.Id)
</form>
...

затем сделайте это так:

@model ParentPageViewModel
...
@foreach (var item in Model.Children)
{
    @Html.EditorFor(m => item)
}
...

или, если вы предпочитаете сохранить представление как частичное, а не как шаблон редактора, используйте Саймон!--10-->.