2016-02-16 2 views
1

Фон Нам необходимо отправить модель с товарами. Для этой цели, мы делаем эту сложную модель:ASP.Net MVC 6 PartialView моделирование путаницы

public class PaymentViewModel 
{ 
    public decimal? Payment { get; set; } 
    public string Description { get; set; } 

    public List<SplittedPaymentViewModel> SplittedPayment { get; set; } = new List<SplittedPaymentViewModel>(); 
} 

public class SplittedPaymentViewModel 
{ 
    public short SplittedPaymentId { get; set; } 
    public decimal? Payment { get; set; } 
    public string Description { get; set; } 
} 

Для рендеринга HTML, мы эти два вида, один регулярный: CreatePayment

@model ZevApp.ViewModels.Record.PaymentViewModel 
... 
<input class="form-control" asp-for="Payment" type="number" /> 
<input class="form-control" asp-for="Description" /> 
... 
<div class="panel-body" id="SplittedPayments"> 
@foreach (var spItem in Model.SplittedPayment) 
{ 
    @Html.Partial("SplittedPaymentPartial", spItem); 
} 
... 
</div> 

И другой Partial: SplittedPaymentPartial

@model ZevApp.ViewModels.Record.SplittedPaymentViewModel 
... 
<input class="form-control" asp-for="Payment" type="number" /> 
<input class="form-control" asp-for="Description" /> 
... 

Как вы можете видеть, с первого взгляда мы называем частичный вид и передаем их по item form SplittedPayment список.

Неожиданно поведение Бежим код, но неожиданно поведение происходит: Каждый частичный вид связывания Оплата и Описание форма родительского PaymentViewModel, а не от прошедшего дня?

Кто-нибудь знает, что не так?

Каждый вид определяет модель в начале файла.

От контроллера мы возвращаемся PaymentViewModel, и для испытания, есть дерево SplittedPaymentViewModel s. Но мы не можем видеть значения из элементов.

+0

Вот [тестовый проект] (https://drive.google.com/file/d/0B5bsSH-06GTYSU1kaDQxQS02NUU/view?usp=sharing) и использование шаги этапа: 1. Запустите проект, щелкните по ссылке «CreatePayment». Инициализированные данные хорошо связаны. 2. Нажмите кнопку «Отправить». 3. После рендеринга страницы вы можете видеть, что для каждого _SplittedPayment_, _Payment_ и _Description_ были связаны с _PaymentViewModel_ not form _SplittedPayment_. Если вы поставили точку останова в режиме отладки на _публичной IActionResult CreatePayment (модель PaymentViewModel) _, вы можете видеть, что модель в порядке - она ​​содержит 2 элемента – Igor

+0

Это странно! Почему бы не добавить новое поле в SplitedPaymentViewModel и связать его с входом в частичном представлении? (Или вы можете использовать Id для этой цели.) Таким образом, вы будете уверены, что входы вида привязаны к правильному экземпляру модели. –

ответ

2

Я нашел, что проблема была CreatePayment.cshtml (спасибо людям из сообщества MVC). Он не предоставляет никакой информации о выражении spItem при вызове частичного представления.

var savePrefix = ViewData.TemplateInfo.HtmlFieldPrefix; 
for (var i = 0; i < Model.SplittedPayment.Count; i++) 
{ 
    ViewData.TemplateInfo.HtmlFieldPrefix = Html.NameFor(m => m.SplittedPayment[i]); 

    var spItem = Model.SplittedPayment[i]; 
    @Html.Partial("SplittedPaymentPartial", spItem); 

    ViewData.TemplateInfo.HtmlFieldPrefix = savePrefix; 
} 

Вы можете найти полное описание на https://github.com/aspnet/Mvc/issues/4106

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