при нажатии на создать новое отверстие хотелось бы иметь возможность выбирать идентификатор курса

#c# #html #asp.net-mvc #entity-framework

#c# #HTML #asp.net-mvc #entity-framework

Вопрос:

Я пытаюсь создать приложение для подсчета очков в гольфе. Я создал базу данных, в которой есть следующие таблицы Round, Course и Hole.

Таблица отверстий имеет внешний ключ для идентификатора курса, так как при создании каждого отверстия я хочу связать его с курсом.

При нажатии на create new я хотел бы иметь выпадающий список для выбора идентификатора курса при вводе всех сведений о отверстии.

Но когда я нажимаю на create new, я получаю следующую ошибку в модели представления отверстий.

Система.Исключение АргументаNullException: значение не может быть нулевым. Элементы имени параметра. в моем коде действия Create в HoleViewModelController.

Это мой код HoleViewModel

     public class HoleViewModel
{
    [Key]
    public int HoleId { get; set; }

    public int HoleNumber { get; set; }

    public int Par { get; set; }

    public int Length { get; set; }

    public int StrokeIndex { get; set; }

    [ForeignKey("Course")]
    public int? CourseId { get; set; }
    public IEnumerable<SelectListItem> CourseNamesDropdownList { get; set; }

    public virtual CourseViewModel Course { get; set; }
}
  

}

Это мой код CourseViewModel

     public class CourseViewModel
{
    [Key]
    public int CourseId { get; set; }

    public string CourseName { get; set; }
  

Это мое действие создания HoleViewModelController

         public ActionResult Create()
    {
        ViewBag.CourseId = new SelectList(db.CourseViewModels, "CourseId", "CourseName");
        return View();
    }
  

Это мой MVC Create view

 @using (Html.BeginForm()) 
  

{
@Html.AntiForgeryToken()

 <div class="form-horizontal">
    <h4>HoleViewModel</h4>
    <hr />
    @Html.ValidationSummary(true, "", new { @class = "text-danger" })
    <div class="form-group">
        @Html.LabelFor(model => model.HoleNumber, htmlAttributes: new { @class = "control-label col-md-2" })
        <div class="col-md-10">
            @Html.EditorFor(model => model.HoleNumber, new { htmlAttributes = new { @class = "form-control" } })
            @Html.ValidationMessageFor(model => model.HoleNumber, "", new { @class = "text-danger" })
        </div>
    </div>

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

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

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

    <div class="form-group">
        @Html.LabelFor(model => model.CourseId, "CourseId", htmlAttributes: new { @class = "control-label col-md-2" })
        <div class="col-md-10">
            @Html.DropDownListFor(model => model.Course.CourseId, Model.CourseNamesDropdownList, "Please select from List", new { @class = "form-control" })
            @Html.ValidationMessageFor(model => model.CourseId, "", new { @class = "text-danger" })
        </div>
    </div>

    <div class="form-group">
        <div class="col-md-offset-2 col-md-10">
            <input type="submit" value="Create" class="btn btn-default" />
        </div>
    </div>
</div>
  

Комментарии:

1. Казалось бы, это db.CourseViewModels значение равно нулю.

2. Я вижу, что в ошибке указано, что БД. CourseViewModel имеет значение null, однако в базе данных есть значение, поэтому не понимаю, почему оно говорит, что оно равно null или как я получаю значения для отображения. При создании отверстий будет возможность назначить его нескольким разным курсам.

3. Где вы создали экземпляр db ?

4. В верхней части HoleViewController у меня есть следующий код private mygolfscore AppDB db = new mygolfscore AppDB();

5. Хорошо, это немного странно. Я не уверен, что это значит, tbh. Может быть, кто-то с большим опытом работы с EF поможет в этом.

Ответ №1:

Итак, я решил эту проблему, исправив код создания ActionResult из

         public ActionResult Create()
{
    ViewBag.CourseId = new SelectList(db.CourseViewModels, "CourseId", "CourseName");
    return View();
}
  

Для

         public ActionResult Create()
    {
        var dbcourse = db.Course.ToList();

        //Make selectlist, which is IEnumerable<SelectListItem>
        var courseNameDropdownList = new SelectList(db.Course.Select(item => new SelectListItem()
        {
            Text = item.CourseName.ToString(),
            Value = item.CourseId.ToString()
        }).ToList(), "Value", "Text");

        // Assign the Selectlist to the View Model   
        var viewCourse = new HoleViewModel()
        {
            Course = dbcourse.FirstOrDefault(),
            // The Dropdownlist values
            CourseNamesDropdownList = courseNameDropdownList,

        };

        //ViewBag.CourseId = new SelectList(db.CourseViewModels, "CourseId", "CourseName");
        return View(viewCourse);
    }
  

Это позволило заполнить выпадающий список и добавить его в представление.