c# - SelectList当bindproperty需要的值是asp.net和entity framework中的一个类

标签 c# asp.net-core entity-framework-core razor-pages

我有一个项目创建页面。该项目需要一个名称和一个客户。我正在使用 Entity Framework Core(Code First)并且有“Project”和“Client”模型,Project 模型中客户端的属性是;

public Client Client { get; set; }

当我第一次制作页面时,属性是错误的;

public int Client { get; set; }

现在,当我为项目模型创建创建页面时,它使用了不正确的属性。现在,在我更正了项目模型之后,当我尝试将项目添加到数据库时,未在选择列表中选择客户端值(它说该值为空,确实如此)。

这是填充选择列表的代码;

public void PopulateClientsDropDownList()
        {
            var Clients = from c in _context.Clients
                          orderby c.ClientName
                          select c;


            ClientList = Clients.Select(x => new SelectListItem
            {
                Text = x.ClientName,
                Value = x.id.ToString()
            }).ToList();

        }

这是实际页面的代码

<form method="post">
            <div asp-validation-summary="ModelOnly" class="text-danger"></div>
            <div class="form-group">
                <label asp-for="Project.ProjectName" class="control-label"></label>
                <input asp-for="Project.ProjectName" class="form-control" />
                <span asp-validation-for="Project.ProjectName" class="text-danger"></span>
            </div>
            <div class="form-group">
                <label asp-for="Project.Client" class="control-label"></label>
                <select asp-for="Project.Client" asp-items="Model.ClientList" class="form-control">
                    <option value="">-- Select Client --</option>
                </select>
                <span asp-validation-for="Project.Client" class="text-danger"></span>
            </div>
            <div class="form-group">
                <input type="submit" value="Create" class="btn btn-primary" />
            </div>
        </form>

这是模型

public class Project
    {
        [Key]
        public int Id { get; set; }
        [Required]
        public string ProjectName { get; set; }


        //Dates
        [Required]
        [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
        public DateTime CreateDate { get; set; }
        [Required]
        [DatabaseGenerated(DatabaseGeneratedOption.Computed)]
        public DateTime UpdateDate { get; set; }


        //Relationships
        [Required]
        public Client Client { get; set; }
        public virtual List<Spread> Spreads { get; set; }

    }
public class Client
    {
        [Key]
        public int id { get; set; }
        [Required]
        public string ClientName { get; set; }

    }

谢谢你的帮助

最佳答案

Select Tag Helper asp-forselect 指定模型属性名称元素不是模型对象名称,asp-items 指定了 option元素。

尝试改变你的 Project 模型如下:

 public class Project
{
    [Key]
    public int Id { get; set; }
    [Required]
    public string ProjectName { get; set; }


    //Dates
    [Required]
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public DateTime CreateDate { get; set; }
    [Required]
    [DatabaseGenerated(DatabaseGeneratedOption.Computed)]
    public DateTime UpdateDate { get; set; }

    //Relationships
    [Required]
    public int Clientid { get; set; }

    public Client Client { get; set; }
    public virtual List<Spread> Spreads { get; set; }
}

页面模型

public IActionResult OnGet()
    {
        var Clients = from c in _context.Clients
                      orderby c.ClientName
                      select c;

        ClientList = Clients.Select(x => new SelectListItem
        {
            Text = x.ClientName,
            Value = x.id.ToString()
        }).ToList();

        return Page();
    }

    [BindProperty]
    public Project Project { get; set; }

    [BindProperty]
    public List<SelectListItem> ClientList { get; set; }

创建页面

<form method="post">
        <div asp-validation-summary="ModelOnly" class="text-danger"></div>
        <div class="form-group">
            <label asp-for="Project.ProjectName" class="control-label"></label>
            <input asp-for="Project.ProjectName" class="form-control" />
            <span asp-validation-for="Project.ProjectName" class="text-danger"></span>
        </div>

        <div class="form-group">
            <label asp-for="Project.Client" class="control-label"></label>
            <select asp-for="Project.Clientid" asp-items="Model.ClientList" class="form-control">
                <option value="">-- Select Client --</option>
            </select>

            <span asp-validation-for="Project.Clientid" class="text-danger"></span>
        </div>

        <div class="form-group">
            <input type="submit" value="Create" class="btn btn-primary" />
        </div>
    </form>

关于Select tag helper,可以引用以下链接:

https://learn.microsoft.com/en-us/aspnet/core/mvc/views/working-with-forms?view=aspnetcore-3.0#the-select-tag-helper

https://www.learnrazorpages.com/razor-pages/forms/select-lists

关于c# - SelectList当bindproperty需要的值是asp.net和entity framework中的一个类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58067175/

相关文章:

.net-core - EF Core Fluent API 中的多对多关系

c# - ToolTip 用于显示集合中项目的索引。 C# WPF MVVM

c# - 按相关实体搜索

c# - xs :key, 为什么当键值不是键引用的成员时验证通过?

c# - 如何在使用 DapperExtensions 映射时指定 Schema?

c# - 为什么默认 webapi .Net Core 应用程序中没有任何内容传递给 .UseStartup<Startup>() 方法?

asp.net-core - EditorFor Tag Helper 在使用 FluentValidator 时不呈现验证属性

C# UDP 套接字 : Get receiver address

c# - ASP.NET Core 3 : Cannot resolve scoped service 'Microsoft.AspNetCore.Identity.UserManager` 1[Alpha. Models.Identity.User]' 来自根提供商

ASP.NET核心API : How to use MySQL