0

다른 테이블의 값을 사용하여 선택한 옵션에 모델을 연결하는 ASP.NET MVC에서 DropDownListFor를 사용하려고했습니다. 전체 공개, 나는 내가하고있는 일을 거의 생각하지 않고 예제를 사용하고있다.DropdownListFor가 제대로 작동하지 않습니다.

@Html.DropDownListFor(model => model.GenreId, (SelectList)ViewBag.GenreSelect, new { @class = "form-control" }) 

GenreId 모델의 테이블에있는 열입니다 : 다음과 같이 DropDownList로 만들기

. (ID와 이름이 장르 테이블의 열입니다)

private void SetGenreViewBag(int? GenreId= null) 
    { 
     if (GenreId== null) 

      ViewBag.GenreSelect= new SelectList(db.Genres, "Id", "name"); 

     else 

      ViewBag.GenreSelect = new SelectList(db.Genres, "Id", "name", GenreId); 

    } 

모델가 열이 있습니다

An exception of type 'System.InvalidOperationException' occurred in System.Web.Mvc.dll but was not handled in user code

Additional information: There is no ViewData item of type 'IEnumerable' that has the key 'GenreId'

ViewBag가보기로 이동하기 전에 다음과 같이 설정합니다

나는 오류를 얻을 장르의 이드.

필자의 주요 문제는 DropDownListFor 함수의 구문을 이해할 수 없다는 것입니다. 게다가 해독하기 힘들 정도로 12 가지의 오버로드가 있습니다. 람다에 대한 첫 번째 매개 변수의 목적은 무엇입니까? 선택 목록 값에서 지정하는 값을 취하는 것 같지만 모델에 연결하는 방법을 얻지 못합니다. 온라인에서 명확한 답변을 찾지 못했습니다.

나는이 일을했다고 생각했지만, 내가 그 일을 멈추게 만들었다. 또한 DropDownList()를 사용하여 그 전에 작업 했었지만 DropDownListFor가 조금 더 나아졌으며 DropDownList()에서 제대로 작동하는 HTML 특성을 얻을 수 없다는 것을 알았습니다.

감사합니다.

편집 : 내부 컨트롤러 :

public ActionResult Create() 
    { 
     SetGenreViewBag(); 
     return View(); 
    } 

참고 : 드롭 다운 목록의 모든 권리 항목 (즉, 장르)를 표시하지만 양식을 저장할 때 충돌이 발생합니다.

// POST: Home/Create 
    [HttpPost] 
    public ActionResult Create(Song songToCreate) 
    { 
     try 
     { 
      db.Songs.Add(songToCreate); 
      db.SaveChanges(); 
      return RedirectToAction("Index"); 
     } 
     catch 
     { 
      return View(); 
     } 
    } 

노래 모델 :이 구문이있을 때

namespace MyModule.Models 
{ 
using System; 
using System.Collections.Generic; 

public partial class Song 
    { 
     public int Id { get; set; } 
     public string name { get; set; } 
     public int genreId { get; set; } 
    } 
} 
+0

내부 오류를 찾기 위해 catch 블록에 (Exception ex)을 추가? –

+0

컨트롤러의 Create() 메서드 내부. 이것을 포함하도록 질문을 업데이트했습니다. – shim

+0

[HttpPost] 속성을 가진'Create' 메소드의 코드를 추가하십시오. – ekad

답변

1

@Html.DropDownListFor(model => model.GenreId, (SelectList)ViewBag.GenreSelect, new { @class = "form-control" }) 

는 첫 번째 매개 변수는 모델의 특성은 드롭 다운의 선택된 값이 할당됩니다 나타냅니다 이 경우 GenreId입니다. 난 당신이 드롭 다운을 생성하는 방식으로 잘못된 볼 수 없지만, 당신이 양식을 저장할 때 오류가 발생하기 때문에, 나는 문제가 [HttpPost] 속성 아래의 Create 메서드 안에 있다고 생각합니다. 나는 오류가 try 블록 내부의 이유로 발생하는 것으로 추측 할

[HttpPost] 
public ActionResult Create(Song songToCreate) 
{ 
    try 
    { 
     db.Songs.Add(songToCreate); 
     db.SaveChanges(); 
     return RedirectToAction("Index"); 
    } 
    catch 
    { 
     return View(); 
    } 
} 

은 다음 catch 블록의 코드가 실행되고 동일한 페이지로 반환하지만 당신이 There is no ViewData item of type 'IEnumerable' that has the key 'GenreId' 오류 때문에 ViewBag.GenreSelect 이미 사라졌다. catch 블록 안에 SetGenreViewBag()을 추가하면 ViewBag.GenreSelect이 다시 채워집니다.또한 어디에서 전화를받을 SetGenreViewBag 않는 try 블록

[HttpPost] 
public ActionResult Create(Song songToCreate) 
{ 
    try 
    { 
     db.Songs.Add(songToCreate); 
     db.SaveChanges(); 
     return RedirectToAction("Index"); 
    } 
    catch (Exception ex) 
    { 
     SetGenreViewBag(); 
     return View(); 
    } 
} 
+0

이제는 충돌하는 대신 페이지를 다시로드하고 아무 것도 저장하지 않습니다. ViewBag 선택 목록 및/또는 DropDownListFor 행 (충돌이 발생하는 곳)을 만드는 방법과 관련된 기본 문제를 해결하지 못합니다. – shim

+0

어떻게'ViewBag'을 만들고'DropDownListFor'를 사용하면 좋을까요? 폼을 저장 한 후에 같은 페이지로 돌아갈 때'ViewBag.GenreSelect'를 다시 채우지 않았기 때문에 오류가 발생했습니다. – ekad

+0

양식을 저장하지 않습니다. – shim

관련 문제