在视图模型中,asp.net mvc核心2选择值始终为0 - c#

我在视图中有一个选择,该选择始终向我的视图模型返回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中,select具有正确的值,如您在screeshot中所见:

在视图模型中,asp.net mvc核心2选择值始终为0 - c#

但是由于某种原因,我从视图模型中的此select接收的值始终为零:

在视图模型中,asp.net mvc核心2选择值始终为0 - c#

另外,如果我没有从选择中选择任何项目,则asp验证将无法捕获。

在过去的4个小时中,我一直在研究此问题,但没有发现类似的问题。

我正在使用Asp.Net MVC Core 2,.Net Core SDK 2.2,Windows 10 Pro和Visual Studio 2017 Community Edition。

参考方案

您看到的是值0,因为这是int的默认值。

提交表单后,默认的模型绑定器将尝试读取表单数据,并将值分配给视图模型对象的相应属性。如果CustomerId是属性并且该属性是可设置的,则模型绑定程序将能够成功执行此操作。

在您共享的代码中,您不是在创建属性而是在创建字段。因此,模型绑定器无法为此设置值。

若要解决此问题,请通过指定CustomerIdset属性访问器将get属性更改为可设置的。

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

ASP.net C#崩溃一行 - c#

我有一个母版页,在on load事件中包含以下几行: string menuIDdata = Page.Request.QueryString["mid"]; menuID = 0; // Get the menu ID if (!int.TryParse(menuIDdata, out menuID)) { menuID = 0; } …

使用Java脚本基于另一个控件项来验证ASP.NET C#控件 - c#

我正在尝试确保一个下拉框或另一个下拉框具有选定的条目,不能两者都选,并且不能都留空/未选择。每次单击运行javascript验证代码的搜索按钮时,即使我只是从一个下拉列表中选择,甚至从两个下拉列表中都没有选择,我都会收到一条消息,好像在两个下拉框中都选择了一样!这可能是我的逻辑,但是,我认为也可能是我的变量读为null。是否有人对问题可能是什么以及如何解决这…

ASP.NET-如何更改JSON序列化的方式? - javascript

我正在使用ASP.NET通过以下查询返回Json文件:public ActionResult getTransactionTotals(int itemID) { DBEntities db = new DBEntities(); var query = from trans in db.Transactions // Linq query removed …

ASP.net WebForms-如何从代码隐藏获取html5数据属性? - javascript

即时通讯试图从HtmlControl获取数据属性(数据图标)...该数据属性是通过js函数设置的,但是当页面回发时,它返回(在代码后面)一个空字符串有什么办法,任何财产,否则就可以得到它?我的代码:HTML:<button id="btnIcon" runat="server" class="btn b…

Asp.Net:在服务器端还原DropDownList的客户端SelectedItem - c#

因此,我的页面上有一个dropDownList,其中包含数百个项目。用户可以通过在文本框中键入一些文本来过滤此DDL。然后对DDL进行相应的过滤(所有不包含输入文本的项目都将通过JavaScript删除)。然后,用户选择他的项目并按下按钮。通常,这将导致错误,因为DDL已更改并且ASP验证了PostBack数据。但是,使用EnableEventValidat…