SelectList, когда значение, требуемое для свойства bind, является классом в asp.net и платформе сущности - PullRequest
2 голосов
/ 23 сентября 2019

У меня есть страница для создания проектов.Проект требует имя и клиент.Я использую Entity Framework Core (Code First), и у меня есть модели как для «Проекта», так и для «Клиента». Свойство для клиента в модели проекта:

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; }

    }

Спасибо за помощь

1 Ответ

0 голосов
/ 24 сентября 2019

Select Tag Helper asp-for задает имя свойства модели для элемента select , а не имя объекта модели, а asp-items задает option elements.

Попробуйте изменить 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; }
}

PageModel

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>

О помощнике по выбору тегов вы можете обратитьсяпо следующим ссылкам:

https://docs.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

...