2016-10-25 2 views
0

내보기는이 모델에 바인딩MVC 뷰 모델 부분적으로 널

public class HomepageViewModel 
{ 
    public HomepageViewModel() 
    { 
     Regions = new List<TMRegion>(); 
    } 

    public List<TMRegion> Regions { get; set; } 

    public int SelectedRegion { get; set; } 

    public SelectList SelectListRegions 
    { 
     get 
     { 
      List<SelectListItem> items = new List<SelectListItem>(); 
      foreach (var tmRegion in Regions) 
      { 
       items.Add(new SelectListItem() 
       { 
        Value = tmRegion.Value.ToString(), 
        Text = tmRegion.Display 
       }); 
      } 
      return new SelectList(items); 
     } 
    } 
} 

내보기는 다음과 같이이다 -

// GET: Search 
    public async Task<ViewResult> Index(HomepageViewModel viewModel) 
    { 
     if (viewModel.Regions.Count == 0) 
     { 
      viewModel = new HomepageViewModel(); 
      JavaScriptSerializer js = new JavaScriptSerializer(); 
      viewModel.Regions = 
       js.Deserialize<TMRegion[]>(
        await _ApiConsumer.ExecuteGetMethod("myurlinhere")) 
        .ToList(); 

     } 

     return View(viewModel); 
    } 
-

@model ProSell.Admin.Models.ViewModels.HomepageViewModel 

@using (Html.BeginForm("Index", "Search", FormMethod.Post, new { viewModel = Model })) 
{ 
    @Html.HiddenFor(m=>m.Regions) 


    @Html.DropDownListFor(model => model.SelectedRegion, Model.SelectListRegions.Items as List<SelectListItem>, "Select a region") 

<input type="submit"/> 

}

내 컨트롤러가 같은 지역을 채 웁니다

드롭 드로우 뷰에 n이 채워집니다. 지역을 선택하고 HomepageViewModel을 제출하면 SelectedRegion이 선택된 ID로 올바르게 설정되지만 지역 컬렉션은 비어 있습니다.

제출시 모델의 목록을 어떻게 유지합니까?

+0

'새 {뷰 모델 = 모델} 제거해보십시오 :

public IEnumerable<SelectListItem> SelectListRegions { get { return Regions.Select(x => new SelectListItem { Text = x.Display, Value = x.Value.ToString() }); } } 

을하고보기에 :

또한이 같은 컬렉션 속성을 정리할 수 있습니다 양식 데이터가 컨트롤러에 제출됩니다. –

+2

복합 객체 컬렉션을 ''에 바인딩 할 수 없습니다. 생성하는 html을 보면 이해할 수 있습니다! 필요하다면 콜렉션을 게시하지 말라. (단,'ModelState'가 유효하지 않고 뷰를 반환해야하는 경우 만 가능하다.) 다시 가져온다. 그리고 모델을'public IEnumerable SelectListRegions {get; 세트; }'- 컨트롤러가 모델을 생성하는 책임이 아니라 –

+1

그리고'SelectList'를'List '으로 캐스팅 할 필요가 없습니다 - 단지 @Html.DropDownListFor (model =>) 일 필요가 있습니다. model.SelectedRegion, Model.SelectListRegions, "Select a Region") –

답변

1

일반적으로 서버가 컬렉션을 검색하기 위해 데이터베이스 호출을하는 것이 훨씬 효율적이므로 클라이언트가 컬렉션과 함께 서버로 다시 보내는 데이터의 양을 줄이려고 시도해야합니다 .

Stephen이 컨트롤러에서 컬렉션 Regions을 다시 채울 수 있다고 말했거나 ModelState 오류로 인해보기를 반환 할 때 필요하면 모델의 생성자에 채우기 코드를 추가 할 수 있습니다. 당신이 필요가 없습니다,`

@Html.DropDownListFor(model => model.SelectedRegion, Model.SelectListRegions, "Select a region")