2012-01-31 4 views
4

여러 엔터티 중에서 선택해야하는 양식이 있습니다. 그래서 여기Asp.net MVC 3 : 컨트롤러에서 모델이 비어 있습니까?

내가 무슨 짓을했는지 있습니다 :

뷰 모델 작성 :

public class EntityChooserModel 
    { 
     public IEnumerable<Entity> AvailableEntities { get; set; } 
     public int SelectedId; 
    } 

내가 컨트롤러에서 두 가지 작업, [HTTPPost], 하나없이 하나를했습니다합니다. 두 가지 모두에서 세션 데이터 인 "SessionUserData"가 데이터 모델 바인딩을 통해 바인딩됩니다.

 [Authorize] 
     public ActionResult EntityChooser(SessionUserData sessionData) 
     { 
      List<Entity> entities = _userStore.GetRoles(User.Identity.Name).Select(ur => ur.Entity).ToList(); 


      Entity entity = sessionData.IdCurrentEntity != null ? entities.Where(e => e.Id == sessionData.IdCurrentEntity).First() : entities.First(); 

      return View(new EntityChooserModel() { SelectedId = entity.Id, AvailableEntities = entities }); 
     } 

.

[Authorize] 
    [HttpPost] 
    public ActionResult EntityChooser(EntityChooserModel model, SessionUserData sessionData, String returnUrl) 
    { 
     if (ModelState.IsValid) 
     { 
      Entity entity = _userStore.GetRoles(User.Identity.Name).Select(ur => ur.Entity).Where(e => e.Id == model.SelectedId).First(); 
      sessionData.IdCurrentEntity = entity.Id; 
      RedirectToDefaultPage(returnUrl); 
     } 
     return View(model); 
    } 

그리고 강력한 형식의보기 :

@model My.Full.Namespace.EntityChooserModel 
@{ 
    ViewBag.Title = "EntityChooser"; 
    Layout = "~/Views/Shared/_LoginLayout.cshtml"; 
} 
<div id="login-wrapper"> 
    <div id="title"> 
     <h1>Login</h1> 
    </div> 
    <div id="login"> 
     @using (Html.BeginForm("EntityChooser", "Auth", FormMethod.Post, new { id = "ChooseFormId" })) 
     {    
      @Html.ValidationSummary(true, "Loggin error") 
      <div> 
       <span>Choose an entity:</span> 
       @Html.DropDownListFor(x => x.SelectedId, new SelectList(Model.AvailableEntities, "Id", "Name")) 
      </div> 
      <p class="right-aligned"> 
       <a href="javascript:document.getElementById('ChooseFormId').submit();" class="adm-button"> 
        <span class="next-btn"><span>Select</span></span></a> 
      </p> 
      <input type="submit" style="display: none" /> 
     } 
    </div> 
</div> 

문제는 내가 두 번째 모델에서 데이터를 수신 할 때, 나는 빈 개체를했습니다 것입니다. 콜렉션은 비어 있으며 id는 기본값 (0)으로 설정됩니다.

무엇이 잘못 되었나요? 나는 이것에 관해 내가 놓친 것을 발견 할 수 없다.

내가 ForModel()하지 않은 MVC 형식을 처음이고, 나는 DropDownList로

답변

7

에게 <form>에 포함 된 경우에만 입력 요소를 사용했습니다 처음 전송 한 방울 다운 목록 POST 할 때 선택한 값만 서버에 보냅니다. 따라서 AvailableEntities 컬렉션 속성이 비어있는 이유가 설명됩니다.

마찬가지로 지금까지 SelectedId 필드가 비어 당신은 왜 필드로 정의되지 않은 특성로했기 때문에, 그대로. 기본 모델 바인더는 속성에서만 작동합니다. 당신이 채워 싶다면 당신은 속성으로 정의해야합니다

public int SelectedId { get; set; } 

가 늘어나는만큼 AvailableEntities 특성에 관한 한 당신이 선택한 ID를 사용하여 POST 활동에 저장소에서 그것을 채울 수 있습니다.

+0

좋아요! 나는 왜 내가 대신에 여기에 들판을 놓았는지 모르겠다! 정말 고맙습니다! – J4N

관련 문제