我在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帮助我尽快:(
答案 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>
}
此外,我强烈建议您使用视图模型。不要将您的域实体传递给您的视图。定义视图模型。