无法从下拉列表中添加数据

时间:2012-03-22 08:06:41

标签: asp.net-mvc-3 nhibernate html.dropdownlistfor

我在asp.net中使用nhibernate和mvc3 我正在尝试将数据添加到表中,我的表模式如下所示:

 public class HobbyMasters
{
    [Key]
    public virtual int HobbyId { get; set; }

    [Required(ErrorMessageResourceType = typeof(Resources), ErrorMessageResourceName = "NameRequired")]
    public virtual string HobbyName { get; set; }

    public virtual HobbyTypes HobbyType { get; set; }
    [Required]
    public virtual string HobbyDetails { get; set; }
    [Required]
      public virtual ICollection<HobbyMasters> HobbyNames { get; set; }
}
  public class HobbyTypes
{
    [Key]
    public virtual int HobbyTypeId { get; set; }
    [Required]
    public virtual string HobbyType { get; set; }
           public virtual ICollection<HobbyTypes> Hobby { get; set; }
}

在我的控制器中

   public ActionResult Create()
    {
         ViewBag.c1 = (ICollection<HobbyTypes>)(new Hobby_MasterService().GetAllHobbyTypes());
         return View();
    } 

    //
    // POST: /Hobbies/Create
          [HttpPost]
    public ActionResult Create(HobbyMasters hobby)
    {
        ViewBag.c1 = (ICollection<HobbyTypes>)new Hobby_MasterService().GetAllHobbyTypes();
        try
        {
            if (ModelState.IsValid)
            {
                new Hobby_MasterService().SaveOrUpdateHobby(hobby);
                return RedirectToAction("Index");
            }
       }
   }

在视图中:

 @using (Html.BeginForm("Create", "Hobbies", FormMethod.Post))
 {
  @Html.ValidationSummary(true)
  <fieldset> 

    <legend>Hobby Master</legend>

    <div class="editor-label">
        @Html.LabelFor(model => model.HobbyName)
    </div>
    <div class="editor-field">
        @Html.EditorFor(model => model.HobbyName)
        @Html.ValidationMessageFor(model => model.HobbyName)
    </div>

    <div class="editor-label">
    @Html.LabelFor(model => model.HobbyType)
    </div>
    <div class="Editor-field">
   @Html.DropDownListFor(model =>model.HobbyType.HobbyTypeId, new SelectList(ViewBag.c1, "HobbyTypeId", "HobbyType"), "-- Select --")
 @Html.ValidationMessageFor(model => model.HobbyType)

    </div>

     <div class="editor-label">
        @Html.LabelFor(model => model.HobbyDetails)
    </div>
    <div class="editor-field">
        @Html.EditorFor(model => model.HobbyDetails)
        @Html.ValidationMessageFor(model => model.HobbyDetails)
    </div>
 </fieldset>
 <p><input type="Submit" value="Create" /> </p>
  }

显然我发现我的Modelstate.IsValid总是假..... 因为它只存储HobbyId并将Hobby Type作为null HobbyMasters的hobbytype对象..... dnt知道我出错的地方可能是在下拉列表或其他地方..... Plaese帮助我尽快:(

1 个答案:

答案 0 :(得分:1)

您的代码存在一些问题:

  • 首先,您使用[Required]属性修饰了HobbyNames集合属性。您应该仅对简单属性使用此属性。事实上你可以离开房产,但它绝对没有效果

  • 您的代码的第二个问题是,您使用HobbyType属性修饰了HobbyTypes模型的[Required]字符串属性,但您从未在视图中使用此属性。因此,当您提交表单并且模型无效时,不会发送任何值。

  • 您的代码的另一个问题是您将下拉列表绑定到model => model.HobbyType.HobbyTypeId属性。但HobbyTypeId不是可以为空的类型。然而,您的下拉列表包含默认值:"-- Select --"。这是不可能的。如果您想要一个带有可选值的下拉列表,您必须将其绑定到模型上的可空属性。

我试图稍微清理你的代码。

型号:

public class HobbyMasters
{
    public virtual int HobbyId { get; set; }

    [Required]
    public virtual string HobbyName { get; set; }

    public virtual HobbyTypes HobbyType { get; set; }

    [Required]
    public virtual string HobbyDetails { get; set; }

    public virtual ICollection<HobbyMasters> HobbyNames { get; set; }
}

public class HobbyTypes
{
    [Required]
    public virtual int? HobbyTypeId { get; set; }

    public virtual string HobbyType { get; set; }

    public virtual ICollection<HobbyTypes> Hobby { get; set; }
}

控制器:

public class HomeController : Controller
{
    public ActionResult Create()
    {
        ViewBag.c1 = (ICollection<HobbyTypes>)(new Hobby_MasterService().GetAllHobbyTypes());
        var model = new HobbyMasters();
        return View(model);
    } 

    //
    // POST: /Hobbies/Create
    [HttpPost]
    public ActionResult Create(HobbyMasters hobby)
    {
        if (ModelState.IsValid)
        {
            try 
            {
                new Hobby_MasterService().SaveOrUpdateHobby(hobby);
                return RedirectToAction("Index");
            }
            catch (Exception ex)
            {
                ModelState.AddModelError("", ex.Message);
            }
        }

        ViewBag.c1 = (ICollection<HobbyTypes>)new Hobby_MasterService().GetAllHobbyTypes();
        return View(hobby);
    }
}

查看:

@model HobbyMasters

@using (Html.BeginForm())
{
    @Html.ValidationSummary(true)
    <fieldset> 
        <legend>Hobby Master</legend>

        <div class="editor-label">
            @Html.LabelFor(model => model.HobbyName)
        </div>
        <div class="editor-field">
            @Html.EditorFor(model => model.HobbyName)
            @Html.ValidationMessageFor(model => model.HobbyName)
        </div>

        <div class="editor-label">
        @Html.LabelFor(model => model.HobbyType)
        </div>
        <div class="Editor-field">

        @Html.DropDownListFor(model => model.HobbyType.HobbyTypeId, new SelectList(ViewBag.c1, "HobbyTypeId", "HobbyType"), "-- Select --")
        @Html.ValidationMessageFor(model => model.HobbyType.HobbyTypeId)

        </div>

        <div class="editor-label">
            @Html.LabelFor(model => model.HobbyDetails)
        </div>
        <div class="editor-field">
            @Html.EditorFor(model => model.HobbyDetails)
            @Html.ValidationMessageFor(model => model.HobbyDetails)
        </div>
    </fieldset>

    <p><input type="Submit" value="Create" /></p>
}

此外,我强烈建议您使用视图模型。不要将您的域实体传递给您的视图。定义视图模型。

相关问题