#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);
}
Это позволило заполнить выпадающий список и добавить его в представление.