2012-03-13 2 views
2

웹 응용 프로그램에 등록보기가 있습니다. 그러나 계정 등록이 실패하고 내 드롭 다운 메뉴가 빨간색으로 표시됩니다.모델 상태가 잘못된 드롭 다운 메뉴. ASP.NET MVC 3

다음
<div class="editor-label"> 
    @Html.LabelFor(model => model.CompanyId, "Company") 
</div> 
<div class="editor-field"> 
    @Html.DropDownList("Companies", "<Select Company>") 
</div> 

뷰 모델에서 내 관련 코드입니다 :

여기
[Display(Name = "Company")]  
public int? CompanyId { get; set; } 

public IEnumerable<SelectListItem> Companies { get; set; } 

내가보기 컨트롤러 내 관련 코드를 반환하기 전에 : 여기

코드 아래로 내 드롭입니다

ViewBag.Companies = new SelectList(db.Companies, "CompanyId", "CompanyName"); 

내가 디버깅 할 때 ModelState.IsValid이 false를 반환하므로 t를 다시 반환합니다. 그는보고 (내 경우에는 ViewBag.Companies을 다시 설정합니다).

성공적으로 등록을 완료하려면 어떻게해야합니까? 필자는 매개 변수 내에서 각 필수 필드를 채 웁니다. 회사를 선택할 필요는 없습니다. 회사를 선택하지 않으면 ModelState.IsValid이 true를 반환하고 코드를 실행합니다. 그러나 사용자에게 회사와 연결할 수있는 옵션을 제공하고 싶습니다.

감사합니다.

+0

'ModelState'의 오류는 무엇입니까? 오류는'ModelState.Values'의'Errors' 콜렉션에 있어야합니다. – nemesv

+1

{System.InvalidOperationException : 형식 변환기에서 형식 변환 할 수 없으므로 'System.String'형식의 'System.Web.Mvc.SelectListItem'형식으로 매개 변수 변환이 실패했습니다. at System.Web.Mvc.ValueProviderResult.ConvertSimpleType (CultureInfo culture, Object value, Type destinationType) –

+0

@nemesv ^^ 지금이 항목을 살펴보고 있습니다. 'public string CompanyId'에 대한 –

답변

3

모델에 선택 목록이있는 경우 더 나은 접근 방식을 취할 때 ViewBag.Companies을 설정해야하는 이유는 무엇입니까? 필요가 당신은

<div class="editor-label"> 
    @Html.LabelFor(model => model.CompanyId, "Company") 
</div> 
<div class="editor-field"> 
    @Html.DropDownListFor(model => model.CompanyId, Model.Companies, "<Select Company>") 
</div> 

이 뜻이

뷰 모델

public class RegisterViewModel 
{ 
    [Display(Name = "Company")]  
    public int? CompanyId { get; set; } 

    public IEnumerable<SelectListItem> Companies { get; set; } 
} 

컨트롤러

[HttpGet] 
public ActionResult Register() 
{ 
    RegisterViewModel viewModel = new RegisterViewModel(); 
    viewModel.Companies = new SelectList(db.Companies, "CompanyId", "CompanyName"); 

    return View(viewModel); 
} 

추천하고보기에 뭔가가 있어야 추악한 ViewBag

를 사용하지합니다 CompanyId을 서버에 올바르게 바인딩하십시오.

+0

이 방법은 저에게'InvalidOperationException'을줍니다. RegisterViewModel viewModel = 새로운 RegisterViewModel(); viewModel.Companies = new SelectList (db.Companies, "CompanyId", "CompanyName"); 돌아 오는보기 (viewModel); –

+0

나는이 방법을 이전에 시도했지만 유사한 문제로 인해 그러한 것을 저지했습니다. 이 문제를 해결하는 데 도움을 주시면 감사하겠습니다. –

+0

내가 게시 한 뷰 파트를 완전히 복사 했습니까? 난 항상이 패턴을 사용하고 잘 작동합니다. – archil

0

DropDownList는 ASP.Net MVC3에서 이상한 종류입니다. 이 SelectListItem의 열거 형에 제대로 바인딩되지 않습니다. 바운드, 선택된 선택 사항을 모델의 프리미티브에 저장하고 모든 옵션 목록을 별도의 필드에 저장해야합니다.

<div class="editor-label"> 
    @Html.LabelFor(model => model.CompanyId, "Company") 
</div> 
<div class="editor-field"> 
    @Html.DropDownListFor(model => model.CompanyId, new SelectList(Model.Companies)) 
</div> 

그런 다음 모델에서 SelectListItems의 IEnumerable을 IEnumerable 문자열로 변경하십시오.

[Display(Name = "Company")]  
public string CompanyId { get; set; } 

public IEnumerable<string> Companies { get; set; } 

마지막으로, 컨트롤러,

ViewBag.Companies = db.Companies; 

은 그냥 (!) 참고로, 내가 대신 IEnumerable을은 IList을 만드는 것이 좋습니다. 의 드롭 다운 메뉴에서 정확히은 데이터가 표시되는 순서를 고려하므로 모델에 반영되어야합니다.

+0

, 왜'int CompanyId'가 아니겠습니까? –

0

선택한 변수 유형이 문자열이 아닌 경우 모델 상태가 드롭 다운에 대해 항상 유효하지 않습니다. CompanyId를 string으로 변경하십시오.IEnumerable Companies {get; set;}를 사용할 수 있습니다.