2014-02-22 3 views
1

이것은만보기 POST (1 개) 모델

public class MainRegisterViewModel 
{ 
    public RegisterViewModel RegisterModel { get; set; } 
    public RegisterFormValuesViewModel RegisterValues { get; set; } 
} 

RegisterFormValuesViewModel이 컨트롤에 대한 모든 값을 포함 내가보기를 사용하고 모델 (같은 국가, 주 목록과 물건)과 RegisterViewModel입니다 사용자에 대한 정보를 포함합니다.

그런 다음이 컨트롤을로드합니다.

@model ProjetX.Models.MainRegisterViewModel 
@{ 
    IEnumerable<SelectListItem> countries = Model.RegisterValues.Countries.Select(x => new SelectListItem() 
    { 
     Text = x.Country, 
     Value = x.Id.ToString() 
    }); 

    IEnumerable<SelectListItem> states = Model.RegisterValues.States.Select(x => new SelectListItem() 
    { 
     Text = x.State, 
     Value = x.Id.ToString() 
    }); 
} 

<div class="container"> 

    <div class="row"> 
     <div class="col-md-12"> 
      @using (Html.BeginForm("Register", "Account", FormMethod.Post, new { @class = "form-horizontal", role = "form" })) 
      { 

       .... 

       <div class="form-group"> 
        @Html.LabelFor(m => m.RegisterModel.Country, new { @class = "col-md-2 control-label" }) 
        <div class="col-md-10"> 
          @Html.DropDownListFor(m => m.RegisterModel.Country, countries, new { @class = "form-control" }) 
        </div> 
       </div> 

       .... 

또한 레지스터 함수는 MainRegisterViewModel을 매개 변수로 사용합니다.

문제

내가 양식을 제출하면, RegisterFormValuesViewModelNULL입니다.

왜 그런가?

상황에 감사

내가 API에서 RegisterFormValuesViewModel를로드하기 때문에 나는이 일을하고있어 내가 한 번만 전화를 시도하고있다. 문제는 사용자가 오류가있는 양식을 POST하고 다시보기를 반환 할 때 API를 다시 호출하여 RegisterFormValuesViewModel을 가져와야하는 경우였습니다.

전에는 RegisterFormValuesViewModel에 대한 하나의 모델 및 뷰백 이었지만 뷰백이 게시되지 않았기 때문에 양식이로드 될 때마다 API를 호출해야했습니다. 그래서 2 개의 모델을 사용하고 POST를 할 수 있다고 생각했습니다.

+2

오해의 여지가 있지만'RegisterFormValuesViewModel'의 값이 POST에 없으면 모델이 다시 채워지지 않습니다. 예를 들어'states' 드롭 다운 목록의 선택된 값은 요청에 포함되지만 목록을 작성하는 데 사용되는 항목은 요청에 포함되지 않습니다. –

+0

값을 게시하는 간단한 방법이 있습니까? – Marc

+1

조의 대답은 몇 가지 옵션을 제공합니다. 숨겨진 필드가 가장 쉽지만 거대한 요청 (예 : webforms viewstate)을 작성하지 않도록하고 싶습니다. 자주 변경되지 않는 주/국가와 같은 경우에는 대신 캐시에 넣을 수 있습니다. –

답변

3

RegisterFormValuesViewModel의 값을 게시하려면 양식 또는 ModelBinder가 값을 찾을 다른 위치에 포함시켜야합니다. (기본) 모델 바인더는 action 매개 변수, Request.Form, 경로 데이터 및 Request.QueryString에서 값을 선택합니다 (Request.Files도 포함되어 있다고 생각합니다).

RegisterFormValuesViewModel 값이 비싸면 양식과 함께 게시 된 숨겨진 필드로 값을 추가하거나 응용 프로그램 또는 세션 상태와 함께 작동하는 사용자 지정 ValueProviderFactory을 구현할 수 있습니다.

+1

감사합니다. 지금은 이해. – Marc