2012-01-31 65 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)。

出了什么问题?我无法找出我错过了这一个。

这是我第一次做了一个MVC形式不ForModel(),和我第一次使用下拉列表

回答

7

<form>包含唯一的输入元素是一个下拉列表,它发送只有选中的值在POST时发送到服务器。这解释了为什么您的AvailableEntities集合属性为空。

至于为什么SelectedId字段为空,那是因为你已经将它定义为一个,而不是作为一个财产。默认的模型绑定器只能与属性一起使用。所以,如果你想让它来填充你必须将其定义为一个属性:

public int SelectedId { get; set; } 

至于AvailableEntities属性而言,你可以使用选择的ID从POST操作你的资料库填充它。

+0

上帝喜欢!我不知道为什么我在这里放置一个场,而不是一个属性!非常感谢! – J4N 2012-01-31 13:46:55