2014-11-11 1 views
0

레거시 코드 인 MVC 응용 프로그램을 사용하고 있습니다. 지금까지 내가 만든 변경 사항은 AccountDivisionModel 개체 목록을 검색하는 2 가지 호출입니다. 원래 코드는 저장 프로 시저를 호출하고 데이터가 포함 된 ObjectResult을 반환했습니다.MVS보기에서 MultiSelectList.SelectedValues를 표시 할 수 없습니다.

public class AccountDivisionModel 
{ 
    int DivisionID; 
    string DivisionName; 
    int AccountID; 
    bool IsActive; 
} 

나는 계정과 계정의 접촉에 속하는 (선택) 부서의 목록에 속하는 부서의 목록을 검색이 호출을하고있다. 심지어 내가 텍스트 상자 (@placeholder)를 클릭하면 비록 내 편집보기에서

var aDivs = Account.GetDivisionByAccountID(c.AccountID).ToArray(); 
var cDivs = Contact.GetDivisionByContactID(c.ContactID).ToArray(); 
ViewBag.AccountDivisions = new MultiSelectList(aDivs, "DivisionID", "DivisionName", cDivs); 

SelectedValues가 표시되지 않는 이유를 모르겠어요

@Html.DropDownList("AccountDivisions", null, htmlAttributes: new { @class = "form-control", @multiple = "multiple", @placeholder = "Select Division(s)" }) 

는, 나는 드롭을 채울 볼 수 있습니다 모든 부서와 함께 다운 목록.

내가 잘못 했습니까?

아래는 현재 작업중인 인터페이스의 이미지입니다. 보시다시피 상자에 표시된 선택 값과 선택되지 않은 나머지 항목을 보여주는 드롭 다운 목록. 즉, 당신은이 모든 잘못된 일을 할 수

@Html.DropDownList("AccountDivisions", null, htmlAttributes: new 
     { @class = "form-control", multiple = "multiple", placeholder = "Select Division(s)" }) 

C#에서 예약어이기 때문에

image of the current working interface

+0

일부 값에 따라 목록에서 미리 선택된 옵션 중 일부가 표시 될 것으로 예상합니까? –

+0

예. 이 페이지에 올 때마다 이전에 연락처에 추가 한 부서가 표시됩니다. 드롭 다운 목록에서 더 많은 부분을 추가하거나 사전 선택된 부분을 제거 할 수 있습니다. –

+1

'MultiSelectList'를 만들기 위해 사용하고있는 오버로드는 선택된 값의 콜렉션을 받아들입니다. 옵션 값으로 'DivisionID'를 사용하고 있기 때문에 (마지막으로'int'라고 가정합니다), 마지막 매개 변수는 여러분이 선택하고자하는 값을 포함하는'IEnumerable '이어야합니다. 그러나 당신은 실제로'int [] SelectedDivisions'와 같은 속성을 가진 뷰 모델을 사용하고 @Html.ListBoxFor (m => m.SelectedDivisions, Model.AccountDivisions)를 사용하여 뷰 모델을 바인딩하는 것을 고려해야합니다. 상자. –

답변

1

선택한 값 (보통 int 또는 string의 컬렉션에 MultiSelectList 요구의 제 4 인수) 두 번째 매개 변수의 유형과 일치합니다. 현재 복잡한 객체 컬렉션을 전달하므로 옵션 값과 일치하지 않습니다. 당신은 내가 바인딩이 길을 수있는 선택 부서를 대표하는 모델의 속성을 포함하여 추천 할 것입니다 그러나

var cDivs = Contact.GetDivisionByContactID(c.ContactID).Select(c => c.DivisionIDs); 

var cDivs = Contact.GetDivisionByContactID(c.ContactID).ToArray(); 

을 변경하여이 문제를 해결할 수

모델

public IEnumerable<int> SelectedDivisions { get; set; } 

컨트롤러

model.SelectedDivisions = Contact.GetDivisionByContactID(c.ContactID).Select(c => c.DivisionID); 
ViewBag.AccountDivisions = new MultiSelectList(aDivs, "DivisionID", "DivisionName"); // 4th parameter not required 

보기

@Html.ListBoxFor(m => m.SelectedDivisions, (MultiSelectList)ViewBag.AccountDivisions, new { @class = "form-control"}) // ListBoxFor adds multiple attribute 

이 모델은 다시 게시물에 선택한 값이 포함되어 있습니다.

0

당신은, 클래스 필요한 모든 HTML 속성에 대한 @ 필요하지 않습니다 , DropDown의 일반적인 용도는 사용자가 여러 가지 옵션 중에서 하나의 옵션을 선택하는 것입니다. 그래서 일반적으로 모델이 properities, 같은 것입니다 : 다음 .. 당신이 할 것

List<SelectItems> Accounts 
int SelectedAccount 

@Html.DropDownListFor(x => x.SelectedAccount, (SelectList)x.Accounts) 
+0

나는보기의 아무것도 바꾸지 않았다. 컨트롤러 레벨의 코드 만 변경했기 때문에 내가 뭔가 잘못했다고 생각합니다. 위의 현재 작업 인터페이스의 이미지를 포함 시켰습니다. 나는 부트 스트랩 (bootstrap)이 뷰에서 사용되었다고 생각한다. –

관련 문제