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

У меня есть выбор в представлении, который всегда возвращает 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, выбор имеет правильные значения, как вы можете видетьна скриншоте:

enter image description here

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

enter image description here

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

Я исследовал этоза последние 4 часа и не обнаружил ни одной подобной проблемы.

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

Ответы [ 2 ]

0 голосов
/ 27 августа 2019

Проблема в моем случае заключалась в том, что я забыл отредактировать атрибут Bind (ref: https://docs.microsoft.com/en-us/dotnet/api/system.web.mvc.bindattribute?view=aspnet-mvc-5.2), который был оставлен там, когда я взломал свои контроллеры.

    [HttpPost]
    [ValidateAntiForgeryToken]
    public async Task<IActionResult> Edit(int id, [Bind("Id,Name,BenchmarkScore,PicturePath,Price")] PcComponentItemVM componentVM)
    }
    {
0 голосов
/ 17 декабря 2018

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

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

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

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

[Required]
public int CustomerId { set; get; }
...