Asp.net mvc 2 在发布时使用SelectList中的值填充模型上的属性

Asp.net mvc 2 在发布时使用SelectList中的值填充模型上的属性,asp.net-mvc-2,binding,model,viewmodel,selectlist,Asp.net Mvc 2,Binding,Model,Viewmodel,Selectlist,我正在构建一个Asp.NETMVC2应用程序 我有一个名为Team的实体,它通过公共属性映射到另两个名为Gender和Grade的实体 public class Team { public virtual int Id { get; private set; } public virtual string CoachesName { get; set; } public virtual string PrimaryPhone { get; set; } pu

我正在构建一个Asp.NETMVC2应用程序

我有一个名为Team的实体,它通过公共属性映射到另两个名为Gender和Grade的实体

public class Team
{
    public virtual int Id { get; private set; } 
    public virtual string CoachesName { get; set; } 
    public virtual string PrimaryPhone { get; set; } 
    public virtual string SecondaryPhone { get; set; }
    public virtual string EmailAddress { get; set; } 
    public virtual Grade Grade { get; set; } 
    public virtual  Gender Gender { get; set; } 
}
我有一个像这样的视图模型

public class TeamFormViewModel
{

    public TeamFormViewModel()
    {
        Team = new Team();
        Grade = new SelectList((new Repository<Grade>()).GetList(),"ID", "Name",Team.Grade);
        Gender = new SelectList((new Repository<Gender>()).GetList(), "ID", "Name", Team.Gender);
    }

    public Team Team { get; set; }
    public virtual SelectList Grade { get; set; }
    public virtual SelectList Gender { get; set; }
}
公共类TeamFormViewModel
{
公共团队表单视图模型()
{
团队=新团队();
Grade=new SelectList((new Repository()).GetList(),“ID”,“Name”,Team.Grade);
性别=新选择列表((新存储库()).GetList(),“ID”,“名称”,Team.Gender);
}
公共团队{get;set;}
公共虚拟选择列表等级{get;set;}
公共虚拟选择列表性别{get;set;}
}
我的身体呈现出我所期望的样子。调试Create方法时,我看到团队对象上的Gender和Grade属性为NULL

    [HttpPost, Authorize]
    public ActionResult Create(Team team)
    {
        try
        {
            if (ModelState.IsValid)
            {
                (new Repository<Team>()).Save(team);

            }
            return RedirectToAction("Index");
        }
        catch
        {
            return View();
        }
    }
[HttpPost,授权]
公共行动结果创建(团队)
{
尝试
{
if(ModelState.IsValid)
{
(新建存储库()).Save(团队);
}
返回操作(“索引”);
}
抓住
{
返回视图();
}
}
我做错了什么

谢谢,
Eric

我建议您发布并绑定回视图模型类,而不是实体类。为视图模型类创建一个将返回实体类的扩展方法。下面是一些工作代码:

public class Team
{
   public virtual int Id { get; set; }
   public virtual string CoachesName { get; set; }
   public virtual string PrimaryPhone { get; set; }
   public virtual string SecondaryPhone { get; set; }
   public virtual string EmailAddress { get; set; }
   public virtual Grade Grade { get; set; }
   public virtual Gender Gender { get; set; }
}

public class Grade
{
   public virtual int Id { get; set; }
   public virtual string Name { get; set; }
}

public class Gender
{
   public virtual int Id { get; set; }
   public virtual string Name { get; set; }
}

public class TeamFormViewModel
{
   public TeamFormViewModel()
   {
      var gradeList = (new Repository<Grade>()).GetList();
      var genderList = (new Repository<Gender>()).GetList();
      GradeList = new SelectList(gradeList, "Id", "Name");
      GenderList = new SelectList(genderList, "Id", "Name");
   }

   [HiddenInput(DisplayValue = false)]
   public int Id { get; set; }

   [DisplayName("Coach Name")]
   [Required]
   public string CoachesName { get; set; }

   [DisplayName("Primary Phone")]
   [DataType(DataType.PhoneNumber)]
   [Required]
   public string PrimaryPhone { get; set; }

   [DisplayName("Secondary Phone")]
   [DataType(DataType.PhoneNumber)]
   public string SecondaryPhone { get; set; }

   [DisplayName("Email Address")]
   [DataType(DataType.EmailAddress)]
   [Required]
   public string EmailAddress { get; set; }

   [DisplayName("Grade")]
   [Range(1, 5)]
   public int SelectedGradeId { get; set; }

   [DisplayName("Gender")]
   [Range(1, 5)]
   public int SelectedGenderId { get; set; }

   private int selectedGradeId = 0;
   private int selectedGenderId = 0;

   public SelectList GradeList { get; set; }
   public SelectList GenderList { get; set; }
}

public static class TeamExtensions
{
   public static Team ToTeam(this TeamFormViewModel viewModel)
   {
      return new Team
      {
         Id = viewModel.Id,
         CoachesName = viewModel.CoachesName,
         PrimaryPhone = viewModel.PrimaryPhone,
         SecondaryPhone = viewModel.SecondaryPhone,
         EmailAddress = viewModel.EmailAddress,
         Grade = (new Repository<Grade>())
            .GetList()
            .Where(x => x.Id == viewModel.SelectedGradeId)
            .Single(),
         Gender = (new Repository<Gender>())
            .GetList()
            .Where(x => x.Id == viewModel.SelectedGradeId)
            .Single()
      };
   }

   public static TeamFormViewModel ToTeamFormViewModel(this Team team)
   {
      return new TeamFormViewModel
      {
         Id = team.Id,
         CoachesName = team.CoachesName,
         PrimaryPhone = team.PrimaryPhone,
         SecondaryPhone = team.SecondaryPhone,
         EmailAddress = team.EmailAddress,
         SelectedGradeId = team.Grade.Id,
         SelectedGenderId = team.Gender.Id
      };
   }
}

public class TeamController : Controller
{
   public ActionResult Create()
   {
      var viewModel = new TeamFormViewModel();
      return View(viewModel);
   }

   [HttpPost]
   public ActionResult Create(TeamFormViewModel viewModel)
   {
      if (ModelState.IsValid)
      {
         (new Repository<Team>())
            .Save(viewModel.ToTeam());
      }
      return View(viewModel);
   }
}
公共类团队
{
公共虚拟整数Id{get;set;}
公共虚拟字符串CoachesName{get;set;}
公共虚拟字符串PrimaryPhone{get;set;}
公共虚拟字符串SecondaryPhone{get;set;}
公共虚拟字符串EmailAddress{get;set;}
公共虚拟等级{get;set;}
公共虚拟性别性别{get;set;}
}
公营班级
{
公共虚拟整数Id{get;set;}
公共虚拟字符串名称{get;set;}
}
公共阶级性别
{
公共虚拟整数Id{get;set;}
公共虚拟字符串名称{get;set;}
}
公共类TeamFormViewModel
{
公共团队表单视图模型()
{
var gradeList=(新存储库()).GetList();
var genderList=(新存储库()).GetList();
成绩列表=新的选择列表(成绩列表,“Id”,“名称”);
性别列表=新的选择列表(性别列表,“Id”,“姓名”);
}
[HiddenInput(DisplayValue=false)]
公共int Id{get;set;}
[显示名称(“Coach名称”)]
[必需]
公共字符串CoachesName{get;set;}
[显示名称(“主电话”)]
[数据类型(数据类型.电话号码)]
[必需]
公共字符串主电话{get;set;}
[显示名称(“辅助电话”)]
[数据类型(数据类型.电话号码)]
公共字符串辅助电话{get;set;}
[显示名称(“电子邮件地址”)]
[数据类型(数据类型.电子邮件地址)]
[必需]
公共字符串电子邮件地址{get;set;}
[显示名称(“等级”)]
[范围(1,5)]
public int SelectedGradeId{get;set;}
[显示名称(“性别”)]
[范围(1,5)]
public int selectedgendrid{get;set;}
私有int-selectedGradeId=0;
private int selectedGenderId=0;
公共选择列表等级列表{get;set;}
公共选择列表性别列表{get;set;}
}
公共静态类扩展
{
公共静态团队图腾(此TeamFormViewModel视图模型)
{
返回新团队
{
Id=viewModel.Id,
CoachesName=viewModel.CoachesName,
PrimaryPhone=viewModel.PrimaryPhone,
SecondaryPhone=viewModel.SecondaryPhone,
EmailAddress=viewModel.EmailAddress,
等级=(新存储库())
.GetList()
.Where(x=>x.Id==viewModel.SelectedGradeId)
.Single(),
性别=(新存储库())
.GetList()
.Where(x=>x.Id==viewModel.SelectedGradeId)
.Single()
};
}
公共静态TeamFormViewModel ToTeamFormViewModel(此团队)
{
返回新的TeamFormViewModel
{
Id=team.Id,
CoachesName=团队。CoachesName,
PrimaryPhone=team.PrimaryPhone,
SecondaryPhone=团队。SecondaryPhone,
EmailAddress=team.EmailAddress,
SelectedGradeId=team.Grade.Id,
SelectedGenderId=team.Gender.Id
};
}
}
公共类TeamController:Controller
{
公共操作结果创建()
{
var viewModel=new TeamFormViewModel();
返回视图(viewModel);
}
[HttpPost]
公共操作结果创建(TeamFormViewModel viewModel)
{
if(ModelState.IsValid)
{
(新存储库())
.Save(viewModel.ToTeam());
}
返回视图(viewModel);
}
}
最后,我想谈谈以下观点:

<%@ Page Language="C#" Inherits="System.Web.Mvc.ViewPage<Stack1.Models.TeamFormViewModel>" %>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
   <title>Create</title>
   <script type="text/javascript" src="/Scripts/jquery-1.4.1.js"></script>
   <script type="text/javascript" src="/Scripts/MicrosoftAjax.js"></script>
   <script type="text/javascript" src="/Scripts/MicrosoftMvcValidation.js"></script>
</head>
<body>
   <% Html.EnableClientValidation(); %>
   <% using (Html.BeginForm()) { %>
   <%= Html.ValidationSummary() %>
   <fieldset>
      <legend>Fields</legend>
      <%= Html.LabelFor(x => x.CoachesName) %>
      <p>
         <%= Html.TextBoxFor(x => x.CoachesName) %>
         <%= Html.ValidationMessageFor(x => x.CoachesName) %>
      </p>

      <%= Html.LabelFor(x => x.PrimaryPhone)%>
      <p>
         <%= Html.EditorFor(x => x.PrimaryPhone) %>
         <%= Html.ValidationMessageFor(x => x.PrimaryPhone)%>
      </p>

      <%= Html.LabelFor(x => x.SecondaryPhone)%>
      <p>
         <%= Html.EditorFor(x => x.SecondaryPhone) %>
         <%= Html.ValidationMessageFor(x => x.SecondaryPhone)%>
      </p>

      <%= Html.LabelFor(x => x.EmailAddress)%>
      <p>
         <%= Html.EditorFor(x => x.EmailAddress) %>
         <%= Html.ValidationMessageFor(x => x.EmailAddress)%>
      </p>

      <%= Html.LabelFor(x => x.SelectedGradeId)%>
      <p>
         <%= Html.DropDownListFor(x => x.SelectedGradeId, Model.GradeList) %>
         <%= Html.ValidationMessageFor(x => x.SelectedGradeId)%>
      </p>

      <%= Html.LabelFor(x => x.SelectedGenderId)%>
      <p>
         <%= Html.DropDownListFor(x => x.SelectedGenderId, Model.GenderList) %>
         <%= Html.ValidationMessageFor(x => x.SelectedGenderId)%>
      </p>
      <p>
         <%= Html.HiddenFor(x => x.Id) %>
         <input type="submit" value="Save" />
      </p>
   </fieldset>
   <% } %>
</body>
</html>

创造
领域
x、 CoachesName)%%>

x、 CoachesName)%%>
x、 CoachesName)%%>

x、 主要电话)%%> x、 主要电话)%%> x、 主要电话)%%>

x、 二手电话)%> x、 二手电话)%> x、 二手电话)%>

x、 电子邮件地址)%> x、 电子邮件地址)%> x、 电子邮件地址)%>

x、 SelectedGradeId)%%> x、 SelectedGradeId,Model.GradeList)%%> x、 SelectedGradeId)%%>

x、 SelectedGenderId)%%> x、 SelectedGenderId,Model.GenderList)%%> x、 SelectedGenderId)%%>

x、 Id)%%>


我建议您发布并绑定回视图模型类,而不是实体类。为视图模型类创建一个将返回实体类的扩展方法。下面是一些工作代码:

public class Team
{
   public virtual int Id { get; set; }
   public virtual string CoachesName { get; set; }
   public virtual string PrimaryPhone { get; set; }
   public virtual string SecondaryPhone { get; set; }
   public virtual string EmailAddress { get; set; }
   public virtual Grade Grade { get; set; }
   public virtual Gender Gender { get; set; }
}

public class Grade
{
   public virtual int Id { get; set; }
   public virtual string Name { get; set; }
}

public class Gender
{
   public virtual int Id { get; set; }
   public virtual string Name { get; set; }
}

public class TeamFormViewModel
{
   public TeamFormViewModel()
   {
      var gradeList = (new Repository<Grade>()).GetList();
      var genderList = (new Repository<Gender>()).GetList();
      GradeList = new SelectList(gradeList, "Id", "Name");
      GenderList = new SelectList(genderList, "Id", "Name");
   }

   [HiddenInput(DisplayValue = false)]
   public int Id { get; set; }

   [DisplayName("Coach Name")]
   [Required]
   public string CoachesName { get; set; }

   [DisplayName("Primary Phone")]
   [DataType(DataType.PhoneNumber)]
   [Required]
   public string PrimaryPhone { get; set; }

   [DisplayName("Secondary Phone")]
   [DataType(DataType.PhoneNumber)]
   public string SecondaryPhone { get; set; }

   [DisplayName("Email Address")]
   [DataType(DataType.EmailAddress)]
   [Required]
   public string EmailAddress { get; set; }

   [DisplayName("Grade")]
   [Range(1, 5)]
   public int SelectedGradeId { get; set; }

   [DisplayName("Gender")]
   [Range(1, 5)]
   public int SelectedGenderId { get; set; }

   private int selectedGradeId = 0;
   private int selectedGenderId = 0;

   public SelectList GradeList { get; set; }
   public SelectList GenderList { get; set; }
}

public static class TeamExtensions
{
   public static Team ToTeam(this TeamFormViewModel viewModel)
   {
      return new Team
      {
         Id = viewModel.Id,
         CoachesName = viewModel.CoachesName,
         PrimaryPhone = viewModel.PrimaryPhone,
         SecondaryPhone = viewModel.SecondaryPhone,
         EmailAddress = viewModel.EmailAddress,
         Grade = (new Repository<Grade>())
            .GetList()
            .Where(x => x.Id == viewModel.SelectedGradeId)
            .Single(),
         Gender = (new Repository<Gender>())
            .GetList()
            .Where(x => x.Id == viewModel.SelectedGradeId)
            .Single()
      };
   }

   public static TeamFormViewModel ToTeamFormViewModel(this Team team)
   {
      return new TeamFormViewModel
      {
         Id = team.Id,
         CoachesName = team.CoachesName,
         PrimaryPhone = team.PrimaryPhone,
         SecondaryPhone = team.SecondaryPhone,
         EmailAddress = team.EmailAddress,
         SelectedGradeId = team.Grade.Id,
         SelectedGenderId = team.Gender.Id
      };
   }
}

public class TeamController : Controller
{
   public ActionResult Create()
   {
      var viewModel = new TeamFormViewModel();
      return View(viewModel);
   }

   [HttpPost]
   public ActionResult Create(TeamFormViewModel viewModel)
   {
      if (ModelState.IsValid)
      {
         (new Repository<Team>())
            .Save(viewModel.ToTeam());
      }
      return View(viewModel);
   }
}
公共类团队
{
公共虚拟整数Id{get;set;}
公共虚拟字符串CoachesName{get;set;}
公共虚拟字符串PrimaryPhone{get;set;}
公共虚拟字符串SecondaryPhone{get;set;}
公共虚拟字符串EmailAdd