Неверное значение свойства модели, отображаемое в частичном представлении
у меня есть строго типизированное частичное представление, модель которого содержит свойство с тем же именем, что и модель представления родительской страницы. По какой-то причине механизм рендеринга отображает значение модели родительского представления, а не ожидаемое значение (ну, значение, которое я ожидаю, по крайней мере!)
родительская страница просмотра модели извлечения:
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-->.