Как добавить поле из базы данных в DropDowList в asp. net mvc - PullRequest
0 голосов
/ 08 мая 2020

Как мне добавить поля в DropDownlist из таблицы базы данных. У меня есть таблица языков {Id, Name, Price} и проектов {Id, Name, Hours, Languages, Cost}. У меня есть представление, когда я ввожу данные, но я хочу создать раскрывающийся список с названиями языков. Когда я выбираю имя, которое я хочу, чтобы оно было в базе данных в таблице проектов, cost = Languages.Price * Hours. Вот мой код:

CreateProject.cs html

 <div class="form-group">
            @Html.LabelFor(model => model.Language, htmlAttributes: new { @class = "control-label col-md-2" })
            <div class="col-md-10">
                @*@Html.EditorFor(model => model.Language, new { htmlAttributes = new { @class = "form-control" } })*@
                @Html.ValidationMessageFor(model => model.Language, "", new { @class = "text-danger" })
            </div>
        </div>

ProjectContlorer.cs

[HttpPost]
        [ValidateAntiForgeryToken]
        public ActionResult Create([Bind(Include = "ID,ProjectName,HoursEntity,Description,Language,Technology,Cost")] Project project)
        {
            if (ModelState.IsValid)
            {

                db.Projects.Add(project);
                db.SaveChanges();
                return RedirectToAction("Index");
            }

            return View(project);
        }

Project.cs

using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations.Schema;
using System.Linq;
using System.Web;

namespace Projectvaluation.Models
{
    [Table("Projects")]
    public class Project
    {
        public int ID { get; set; }
        public string ProjectName { get; set; }
        public float HoursEntity { get; set; }

        public string Description { get; set; }
        public string Language { get; set; }
        public string Technology { get; set; }
        public float Cost { get; set; }
    }

}

Ответы [ 2 ]

0 голосов
/ 11 мая 2020

Я нахожу, как создать раскрывающийся список, но знаю, что языки и технологии не сохраняются в моей базе данных. Может кто-нибудь знает, почему это так?

ProjectController.cs

public ActionResult Create()
        {
            using (ApplicationDbContext pvEntity = new ApplicationDbContext())
            {
                var fromDatabaseEF = new SelectList(pvEntity.Languages.ToList(), "Price", "Name");
                ViewData["Languages"] = fromDatabaseEF;
            }

            using (ApplicationDbContext pvEntity = new ApplicationDbContext())
            {
                var fromDatabaseEF = new SelectList(pvEntity.Technologies.ToList(), "Price", "Name");
                ViewData["Technologies"] = fromDatabaseEF;
            }
            return View();
        }

        // POST: Projects/Create
        // To protect from overposting attacks, please enable the specific properties you want to bind to, for 
        // more details see https://go.microsoft.com/fwlink/?LinkId=317598.
        [HttpPost]
        [ValidateAntiForgeryToken]
        public ActionResult Create([Bind(Include = "ID,ProjectName,HoursEntity,Description,Language,Technology,Cost")] Project project)
        {
            //ViewBag.Languages = new SelectList(db.Languages, "Name", "Price", project.Languages);



            if (ModelState.IsValid)
            {

                db.Projects.Add(project);
                db.SaveChanges();
                return RedirectToAction("Index");
            }

            return View(project);
        }

Просмотр проекта

div class="form-group">
            @Html.LabelFor(model => model.Language, htmlAttributes: new { @class = "control-label col-md-2" })
            <div class="col-md-10">
                @Html.DropDownList("Languages", (IEnumerable<SelectListItem>)ViewData["Languages"],"Choose Languages",new { @class = "form-control" } )
                @Html.ValidationMessageFor(model => model.Language, "", new { @class = "text-danger" })
            </div>
        </div>

        <div class="form-group">
            @Html.LabelFor(model => model.Technology, htmlAttributes: new { @class = "control-label col-md-2" })
            <div class="col-md-10">
                @*@Html.EditorFor(model => model.Technology, new { htmlAttributes = new { @class = "form-control" } })*@
                @Html.DropDownList("Technologies", (IEnumerable<SelectListItem>)ViewData["Technologies"],"Choose Technology", new { @class = "form-control" })
                @Html.ValidationMessageFor(model => model.Technology, "", new { @class = "text-danger" })
            </div>
        </div>
0 голосов
/ 09 мая 2020

Я не уверен, что полностью понял ваш вопрос.

На ваш взгляд, вы можете изменить свой EditorFor на:

@Html.DropDownListFor(model => model.Language, Model.Languages, new { htmlAttributes = new { @class = "form-control" } })

Я бы также рекомендовал использовать ViewModels вместо передачи вашей модели в View. Что-то вроде:

public class CreateProjectViewModel {

    public string Language { get; set; }
    public IEnumerable<SelectListItem> Languages { get; set; }

}

На вашей ViewModel у вас будет список SelectListItem, который содержит все элементы, которые вы хотите в раскрывающемся списке.

SelectListItem имеет текст (который отображается) и соответствующее значение.

Наконец, на вашем контроллере при создании ViewModel вы можете заполнить раскрывающийся список данными из вашей базы данных.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...