asp.net mvc core 2 выберите значение всегда 0 в модели представления

2

У меня есть выбор в представлении, который всегда возвращает 0 в мою модель представления, и я не знаю почему:

Посмотреть модель:

// CreateLifeInsuranceViewModel.cs
using InsuranceListManager.Models.EntityFrameworkModels;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;

namespace InsuranceListManager.Models.ViewModels.Home
{
    public class CreateLifeInsuranceViewModel
    {
        [Required]
        public int CustomerId;

        public IList<CustomerModel> Customers { get; set; }

        [Required]
        public string InsuredPersonCPF { get; set; }
    }
}

контроллер

public class HomeController
{
    public IActionResult CreateLifeInsurance()
    {
        var customers = (
            from c in _db.Customers select c    
        ).ToList();

        var model = new CreateLifeInsuranceViewModel
        {
            Customers = customers
        };

        return View(model);
    }

    [HttpPost]
    [ValidateAntiForgeryToken]
    public async Task<IActionResult> CreateLifeInsurance(CreateLifeInsuranceViewModel model)
    {
        if (ModelState.IsValid)
        {
            var category = _db.InsuranceCategories.Where(c => c.Id == InsuranceCategoryModel.LIFE_INSURANCE).First();

            var insurance = new InsuranceModel
            {
                CategoryId = category.Id,
                CustomerId = model.CustomerId
            };

            _db.Add(insurance);
            await _db.SaveChangesAsync();

            var lifeInsurance = new LifeModel
            {
                InsuranceId = insurance.Id,
                InsuredPersonCPF = model.InsuredPersonCPF
            };

            _db.Add(lifeInsurance);
            await _db.SaveChangesAsync();

            return RedirectToAction(nameof(Index));
        }

        return BadRequest(ModelState);
    }
}

Посмотреть:

@model InsuranceListManager.Models.ViewModels.Home.CreateLifeInsuranceViewModel

@{
    ViewData["Title"] = "New Insurance";
}

<h1>New Insurance</h1>

<hr />
<form asp-action="CreateLifeInsurance">
    <div asp-validation-summary="ModelOnly" class="text-danger"></div>
    <div class="form-row">
        <div class="form-group col-sm-6">
            <label asp-for="CustomerId">Customer</label>
            <select class="form-control" asp-for="CustomerId" asp-items="@(new SelectList(Model.Customers, "Id", "Name"))">
                <option value="">Select the customer</option>
            </select>
            <span asp-validation-for="CustomerId" class="text-danger"></span>
        </div>
        <div class="form-group col-sm-6">
            <label asp-for="InsuredPersonCPF">Insured Person CPF</label>
            <input type="text" class="form-control" asp-for="InsuredPersonCPF" placeholder="CPF" />
            <span asp-validation-for="InsuredPersonCPF" class="text-danger"></span>
        </div>
    </div>
    <div class="form-group">
        <input type="submit" value="Create" class="btn btn-primary" />
        <a class="btn" asp-action="Index">Cancel</a>
    </div>
</form>

@section Scripts {
    @{await Html.RenderPartialAsync("_ValidationScriptsPartial");}
}

в отрендеренном HTML выбор имеет правильные значения, как вы можете видеть на скриншоте:

Изображение 174551

Но по какой-то причине значение, которое я получаю от этого выбора в модели представления, всегда равно нулю:

Изображение 174551

Кроме того, проверка ASP не будет поймать, если я не выберу какой-либо элемент из выбора.

Я исследовал это в течение последних 4 часов и не нашел ни одной подобной проблемы вокруг.

Я использую Asp.Net MVC Core 2,.Net Core SDK 2.2, Windows 10 Pro и Visual Studio 2017 Community Edition.

Теги:
asp.net-core
asp.net-core-mvc
asp.net-core-2.0

1 ответ

2
Лучший ответ

Вы видите значение 0 потому что это значение по умолчанию для int.

Когда форма отправлена, механизм связывания модели по умолчанию попытается прочитать данные формы и присвоить значения соответствующим свойствам объекта модели представления. Связыватель модели сможет успешно это сделать, если CustomerId является свойством, а для свойства задана таблица.

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

Чтобы устранить проблему, измените свойство CustomerId для таблицы set, указав методы доступа set и get.

[Required]
public int CustomerId { set; get; }
  • 0
    дело не в том, что «свойство может быть установлено», а в том, что оно должно быть свойством, пока он использует поле. ты не ошибся, только терминология
  • 0
    Это должно быть свойство с set аксессором свойства для связывателя модели, чтобы установить значение. public int CustomerId { get; } не будет работать, даже если это свойство.
Показать ещё 2 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню