2016-10-19 3 views
0

Форма определяется в Add.cshtml:MVC.NET Пуансон/Razor: Отправить значение от Выбрать поле DB

@using bendinsnMusicApp.Models 
@model Album 

<h2>Add Album</h2> 

<form action="Add" method="post"> 
    Title: <input type="text" name="Title" value="" autofocus /> 
    <span asp-validation-for="Title" class="text-danger"></span><br /> 
    Price: <input type="number" name="Price" value="" /> 
    <span asp-validation-for="Price" class="text-danger"></span><br /> 
    Artist: <select name="Artist"> 
     @foreach (Artist artist in ViewBag.Artists) 
     { 
      <option [email protected]>@artist.Name</option> 
     } 
    </select> 
    <span asp-validation-for="Artist"></span><br /> 
    Genre: <select name="Genre"> 
    @foreach (Genre genre in ViewBag.Genres) 
    { 
     <option [email protected]>@genre.Name</option> 
    } 
    </select> 
    <span asp-validation-for="Genre"></span><br /> 

    <input type="submit" value="Submit" /> 
</form> 

Ошибка возникает в следующем действии в мой контроллер, AlbumsController.cs:

[HttpPost] 
public IActionResult Add(Album a) 
{ 
    var albums = _context.Albums; 
    albums.Add(a); 
    _context.SaveChanges(); 
    var albums2 = _context.Genres.ToList(); 
    ViewBag.Artists = _context.Artists.ToList(); 
    ViewBag.Genres = _context.Genres.ToList(); 
    return View("Index", albums2); 
} 

В частности, при попытке сохранить изменения обновление происходит из-за того, что внешние ключи объекта Album, ArtistID и GenreID равны 0 каждый раз, а Artist и Gen - равны нулю. Для полноты картины, вот это класс Альбом:

public class Album 
{ 
    public int AlbumID { get; set; } 
    public string Title { get; set; } 
    [Required] 
    [DataType(DataType.Currency)] 
    public decimal Price { get; set; } 

    public int ArtistID { get; set; } 
    public Artist Artist { get; set; } 
    public int GenreID { get; set; } 
    public Genre Genre { get; set; } 
} 

кажется, что какая-то ошибка препятствует формы от правильной подачи художника и жанровые поля, оба из которых являются select элементы. Кроме того, я ожидаю, что даже если бы фактическое содержимое этих элементов было представлено, оно не включало бы значения FK.

Обратите внимание, что ViewBag.Artists и ViewBag.Genres определены как _context.Artists.ToList() и _context.Genres.ToList() соответственно в действии для визуализации представления. Каждый жанр и исполнитель включает в себя Name и [class]ID, а Исполнитель имеет связанное текстовое поле с именем Bio.

Таблица альбомов содержит поля для AlbumID, ArtistID, GenreID, Price и Title. Первые три являются ints, вторая - десятичной, а последняя - nvarchar.

Что нужно сделать, чтобы:

A) Представить содержание select элементов наряду с остальной частью формы?

B) Использовать значения ArtistID и GenreID (int s в соответствующих классах) в качестве аргументов для заполнения таблицы Albums?

ответ

1

Имя каждого входа выбора должно соответствовать полю в Модели, которое будет заполняться при появлении привязки к модели.

Изменить код:

<select name="Artist"> 

в

<select name="ArtistID"> 

и то же самое для жанра Select, имя = "GenreID"

Это позволит модели Binding подобрать те правильно, а затем вы можете использовать их в контроллере по мере необходимости.

+0

Похоже, что свойство 'asp-validation-for' в элементе' span' следует после каждого 'select' также необходимо изменить, но с этим изменением это, похоже, сработало. – Passage