При отправке формы с частичным значением контроллеру не возвращается значение из частичного

#c# #asp.net-core #razor-pages

Вопрос:

У меня форма на странице Razor выглядит так (я удаляю ненужные данные):

 <form class="form-group form-popup" 
    asp-action="Update"
    data-ajax="true"
    data-ajax-method="POST">
    @Html.AntiForgeryToken()     
    <div class="popup-section">                                         
        <partial name="_FailureCostPartial" model="@Model.CostEdit" />
    </div>
    
    <div class="text-center mt-5 popup-edit-buttons">
        <button class="btn form-success" type="button" onclick="SubmitForm('@popupId')">
            @Localizer.GetLocalizedString("button_Save")<i class="fas fa-check fa-fw"></i>
        </button>
        <button class="btn form-danger" type="button" data-dismiss="modal">
            @Localizer.GetLocalizedString("button_Cancel")<i class="fas fa-times fa-fw"></i>
        </button>
    </div>
</form>
 

Модель, представленная в этом представлении, выглядит следующим образом:

 public class FailureEditViewModel
{
    public FailureForEditDto Failure { get; set; }
    public FailureCostEditViewModel CostEdit { get; set; }
    public List<SelectListItem> Suppliers { get; set; }
}
 

И _FailureCostPartial Выглядит так:

 <div class="details-form-field">
    <label class="col-sm-5">@Localizer.GetLocalizedString(nameof(Model.WorkingHoursCost))</label>
    <div class="input-container col-sm-7">
        <input id="Failure_WorkingHoursCost" asp-for="WorkingHoursCost" value="@Model.WorkingHoursCost" />
        <span asp-validation-for="WorkingHoursCost" class="text-danger"></span>
    </div>
</div>
<div class="details-form-field">
    <label class="col-sm-5">@Localizer.GetLocalizedString(nameof(Model.GeneralCost))</label>
    <div class="input-container col-sm-7">
        <input id="Failure_GeneralCost" asp-for="GeneralCost" value="@Model.GeneralCost" />
        <span asp-validation-for="GeneralCost" class="text-danger"></span>
    </div>
</div>
<div class="details-form-field">
    <label class="col-sm-5">@Localizer.GetLocalizedString(nameof(Model.TravelCost))</label>
    <div class="input-container col-sm-7">
        <input id="Failure_TravelCost" asp-for="TravelCost" value="@Model.TravelCost" />
        <span asp-validation-for="TravelCost" class="text-danger"></span>
    </div>
</div>
<div class="details-form-field">
    <label class="col-sm-5">@Localizer.GetLocalizedString(nameof(Model.TotalFailureCost))</label>
    <div class="input-container col-sm-7">
        <input disabled="disabled" id="Failure_TotalFailureCostField" asp-for="TotalFailureCost" value="@Model.TotalFailureCost" />
        <span asp-validation-for="TotalFailureCost" class="text-danger"></span>
    </div>
</div>
 

И моделью для этого частичного является:

 public class FailureCostEditViewModel
{
    public decimal WorkingHoursCost { get; set; }
    public decimal GeneralCost { get; set; }
    public decimal TravelCost { get; set; }
    public decimal TotalFailureCost { get; set; }
}
 

Теперь, когда я задаю значение во вводе на моем частичном, и я пытаюсь отправить форму (с первого взгляда) в свой метод обновления в контроллере обратно :
введите описание изображения здесь

Что я должен сделать, чтобы исправить обратные данные из частичной модели поля.Сколько это стоит?

Комментарии:

1. Привет @Новее,вы сказали,что используете страницы razor, но почему вы используете asp-action ? Каков ваш внутренний код? Кроме того,что у тебя есть SubmitForm ? Попробуйте добавить имя к элементу ввода, например: name="CostEdit.WorkingHoursCost" в вашем _FailureCostPartial.cshtml .

2. Когда я добавляю имя, оно начинает работать.

3. С удовольствием! 🙂

Ответ №1:

Для каждого свойства сложного типа привязка модели просматривает источники в поисках шаблона имени prefix.property_name . Если ничего не найдено, он ищет только имя свойства без префикса.Для вашей модели получения это вложенная модель,поэтому вам нужен префикс, чтобы отличать свойство.

Попробуйте добавить имя к элементу ввода, например: name="CostEdit.WorkingHoursCost" в вашем _FailureCostPartial.cshtml .