2009-12-14 4 views
2

죄송합니다. 반복되는 질문 인 경우 관련된 질문을 스캔하고 명백한 내용이 없었습니다.Entity Framework를 사용하여 ASP.NET MVC (C#)의 DropDown에서 SelectedValue를 다시 가져 오는 중

두 개의 선택 목록과 함께 Entity 객체가있는 EditModel을 사용하고 있습니다. 문제는 일단 POST 액션에 도달하면 두 드롭 다운의 SelectedValues는 브라우저에서 실제로 선택한 항목과 상관없이 모델의 생성자에서 설정 한 기본값과 여전히 동일합니다.

내 생성자는 SelectedValues에 대한 일부 기본값을 설정하지만 이들은 단지 0이고 ""(드롭 다운의 값은 유효하지 않습니다)입니다. 어떻게 든 문제가 돌아 다니는 느낌이 들지만 자세한 내용을 알려 드리겠습니다. 내가 여기 바보 뭔가를 분명 할 수도

   <div class="field"> 
       <label for="ID">Organization:</label> 
       <%= Html.DropDownList("ID", Model.Organizations) %> 
      </div> 

      <div class="field"> 
       <label for="Name">Role:</label> 
       <%= Html.DropDownList("Name", Model.Roles) %> 
      </div> 

:

public class UserAccountModel 
{ 

    public UserAccount UserAccountData { get; set; } // Entity from EF 
    public SelectList Organizations { get; set; } 
    public SelectList Roles { get; set; } 

    public UserAccountModel() : this(null) 
    { 
    } 


    public UserAccountModel(UserAccount obj) 
    { 
     UserAccountData = (obj == null) ? new UserAccount() : obj; 

     // default selected value 
     int orgChildId = (UserAccountData.Organization == null) ? 0 : UserAccountData.Organization.ID; 
     string roleChildId = (UserAccountData.Role == null) ? "" : UserAccountData.Role.Name; 

     // go get the drop down options and set up the property binding 
     using (UserAccountRepository rep = new UserAccountRepository()) 
     { 
      Organizations = new SelectList(rep.GetOrganizationOptions(), "ID", "ID", orgChildId); 
      Roles = new SelectList(rep.GetRoleOptions(), "ID", "Name", roleChildId); 
     } 
    } 

    public void UpdateModel() 
    { 
     UserAccountData.Organization = Organizations.SelectedValue as Organization; 
     UserAccountData.Role = Roles.SelectedValue as Role; 
    } 
} 

이 뷰의 드롭 다운 부분은 다음과 같습니다

모델의 버전을 박탈입니다. ViewData 사전을 사용할 때 예제가 훨씬 더 직선적이지만 SelectLists에 대한 직선 모델 바인딩을 사용하려는 예제를 너무 많이 찾을 수 없습니다.

도움을 주시면 대단히 감사하겠습니다.

크리스

+3

컨트롤러 코드는 어떻게 생겼습니까? – Lazarus

+1

UserAccountData 구조의 일부 코드를 게시 할 수 있습니다. ViewModel에 바인딩하는 경우 선택 목록의 이름이 "UserAccountData.ID"및 "UserAccountData.Name"이어야한다고 생각합니다. UserAccountData – JOBG

+0

UserAccountData는 Entity Framework에서 코드를 생성하는 엔터티입니다. 그러나 내가 언급 했어야 할 또 하나의 정보는 조직과 역할이 DB의 UserAccount 테이블에있는 외래 키라는 것입니다. UserAccount를 추가 할 때 DB의 기존 선택 항목에서 조직 및 역할을 선택할 수 있어야합니다. 위에 나온 모델의 UpdateModel() 메서드를 사용하여 UserAccountData에 선택한 조직 및 역할을 추가했습니다. – Chris

답변

2

선택 요소 만 선택 그것의 실제 값을 다시 게시를 잊어 버렸습니다. 이 경우 매개 변수는 ID (조직) 및 이름 (역할)으로 서버/컨트롤러에서 다시 수신됩니다. 업데이트 작업에 사용하는 모델은 다음 속성 중 하나를 포함하거나 컨트롤러 작업에서 매개 변수로 직접 받아 들여야합니다. 모델의 목록은 다시 채워지지 않으며 어떤 경우에도 이름이 일치하지 않습니다.

을 추가하여 모델을 수정

public int ID { get; set; } 
public string Name { get; set; } 

같은 컨트롤러 조치 : 유효성 검사 오류가있는 경우, 당신은 selectList의 속성을 다시 채울해야한다는

public ActionResult Update(UserAccountModel userAccount) 
{ 
    ... 
} 

참고합니다 (을 재구성 메뉴).

+0

따라서 모델의 SelectList 속성이 업데이트되지 않습니까? SelectValue가 View에서 실제 선택한 값으로 업데이트 된 것을보고 예상 한 다음 SelectList에서 해당 값을 가져 와서 UserAccountData를 업데이트합니다. 그렇지 않은 경우 귀하의 조언을 듣고 명시적인 속성을 추가하여 업데이트 할 것입니다. – Chris

+0

아니요. 선택한 값만 포스트 형식으로 반환되기 때문에 선택 목록을 다시 채우는 데 사용할 데이터가 없습니다. 나는 항상 열거 형 (IEnumerable 사용)과 선택된 모델에 대한 속성을 모두 속성에 넣는다. – tvanfosson

+0

내 유일한 문제는 내가 저장소 뒤에 Entity Framework를 사용하고 있다는 것입니다. 왜냐하면 그것들은 매우 작기 때문에 나는 SelectLists에리스트 된 완전한 객체들을 실제로 질의하고 있습니다. 결과적으로, 나는 이미 DB로부터 전체 Object를 얻었습니다. SelectedValue ID에 대한 선택 목록에서 조회를 수행하여 전체 데이터를 가져 옵니까? – Chris

1

당신은 단순히 ID 속성에 탐색 경로 :

<%= Html.DropDownList("Organization.ID", Model.Organizations) %> 
+0

나는 이것이 단순 할 수도 있다고 생각했지만, 나는 그 길을 확인했고 그것이 옳다고 생각한다. "조직"(복수)은 실제로 "조직"개체의 선택 목록이므로 ID는 조직의 구성원으로 존재하지 않습니다. Organizations.SelectedValue를 유형 Organization으로 캐스팅해야한다고 생각하지만, View에서 이것이 어떻게 작동하는지 확신 할 수 없습니다. 그러나 제안에 대해서는 열려 있습니다. SelectedValue가 어떻게 든 제대로 설정되지 않을 것이라고 생각됩니다. – Chris