.net core modelstate 使用带有 guid 的 selectlist 无效

.net core modelstate invalid using selectlist with guid

所以我正在我的 webapp 中创建我的第三个 crud 服务。 webapp 是 运行 .net core 3.0。我之前的 2 个 crud apps 项目和员工所在的位置。所以 user/employee 在一个项目上做了一些工作。

所以对于我的 'work' crud service/application 在我的创建视图中,我需要有一个包含所有项目的下拉列表和一个包含所有员工的下拉列表以及一个视图输入。对于员工和项目,id 是一个 guid,因为它是唯一的。但我似乎有一个问题,我的模型状态总是无效的。

ps:也是我的数据模型,可以说它不会创建任何外键,例如带有工作 ID 或员工 ID 的项目 ID。“

工作模型:

public class Work
    {

        public int Id { get; set; }

        [Required]
        [StringLength(512, ErrorMessage = "Description cannot exceed 512 characters!")]
        public string Description { get; set; }        

        [Required]
        [Display(Name = "Working hours")]
        public double WorkingHours { get; set; }

        [Required]
        [Display(Name = "Employee")]
        public Guid EmployeeId { get; set; }

        public Employee Employee { get; set; }

        [Required]
        [Display(Name = "Project")]
        public Guid ProjectId { get; set; }

        public Projects Project { get; set; }

        [Required]
        public DateTime dateAdded { get; set; }


    }

视图模型:

public class WorkViewModel
    {
        public IEnumerable<Projects> projects { get; set; }
        public IEnumerable<Employee> employees { get; set; }
        public Guid employeeId { get; set; }
        public Guid projectId { get; set; }
        public Work work { get; set; }
    }

创建视图:

@model TimeSheetTool.ViewModels.WorkViewModel
@{
    ViewData["Title"] = "Create";
}

<h1>Create</h1>

<div class="row">
    <div class="col-sm-4">
        <form asp-action="Save">
            <div asp-validation-summary="ModelOnly" class="text-danger"></div>
            <div class="form-group">
                <select asp-for="projectId" asp-items="@(new SelectList(Model.projects, "Id", "Name"))">
                    <option>Please select one!</option>
                </select>
                <span asp-validation-for="projectId" class="text-danger"></span>
            </div>

            <div class="form-group">
                <label asp-for="work.Description" class="control-labels"></label>
                <input asp-for="work.Description" class="form-control" />
                <span asp-validation-for="work.Description" class="text-danger"></span>
            </div>

            <div class="form-group">
                <label asp-for="work.WorkingHours" class="control-labels"></label>
                <input asp-for="work.WorkingHours" class="form-control" />
                <span asp-validation-for="work.WorkingHours"></span>
            </div>
            <div class="form-group">
                <select asp-for="employeeId" asp-items="@(new SelectList(Model.employees, "Id", "Name"))">
                    <option>Please select one!</option>
                </select>
                <span asp-validation-for="employeeId" class="text-danger"></span>
            </div>

            <div class="form-group">
                <input type="submit" value="Create" class="btn btn-outline-primary" />
            </div>
        </form>
    </div>
</div>
<div>
    <a asp-action="Index">Back to List</a>
</div>

我做错了什么?正如您在 select 列表的创建视图中看到的那样,我有 ID 我认为它实际上需要 guid,因为我使用的是 guid,但应用程序根本无法运行。

这是因为视图模型中的工作属性。

public Work work { get; set; }

它有验证,如果不满足会导致无效模型状态问题

向视图模型添加必要的属性

public class WorkViewModel {
    public IEnumerable<Projects> projects { get; set; }
    public IEnumerable<Employee> employees { get; set; }
    public Guid employeeId { get; set; }
    public Guid projectId { get; set; }
    [StringLength(512, ErrorMessage = "Description cannot exceed 512 characters!")]
    public string Description { get; set; }        
    [Display(Name = "Working hours")]
    public double WorkingHours { get; set; }
}

并在调用绑定视图的操作时根据需要填充它们

<div class="form-group">
    <label asp-for="Description" class="control-labels"></label>
    <input asp-for="Description" class="form-control" />
    <span asp-validation-for="Description" class="text-danger"></span>
</div>

<div class="form-group">
    <label asp-for="WorkingHours" class="control-labels"></label>
    <input asp-for="WorkingHours" class="form-control" />
    <span asp-validation-for="WorkingHours"></span>
</div>

可以在 post

上将这些值复制到模型中