[英]MVC with Razor creating drop down list
我有以下代码,我能够创建一个下拉列表但是当我提交时,我得到的Object引用没有设置为对象异常的实例。 News
类有Category
和Category类有Id,Name,Order。
我怎样才能解决这个问题?
我的观点:
<div class="editor-field">
@Html.DropDownListFor(m => m.News.Category.Id, Model.Categories, "Select One")
@Html.ValidationMessageFor(m => m.News.Category)
</div>
视图模型:
public class NewsViewModel
{
public string SelectedCategoryId { get; set; }
public IEnumerable<SelectListItem> Categories { get; set; }
public News News { set; get; }
}
和控制器动作:
[HttpPost]
public ActionResult Create(NewsViewModel newsViewModel)
{
try
{
using (var session = NHibernateHelper.OpenSession())
{
using (var tx = session.BeginTransaction())
{
session.Save(newsViewModel.News);
tx.Commit();
}
}
return RedirectToAction("Index");
}
catch
{
return View();
}
}
我在保存模型session.Save(newsViewModel.News);
时获得异常session.Save(newsViewModel.News);
您的下拉列表是否在您的获取请求中填充了值?
如果是,则在提交时,viewModel的m.News.Category.Id属性是否设置了您在下拉列表中选择的值的ID?
如果是,那么它不是下拉列表的问题......它与您正在使用的NHibernate会话有关...尝试类似(新闻)session.Save(newsViewModel.News);
你在哪里创建模型对象? 您在视图中使用Model.Categories,但不将模型对象传递给视图。 您应该将模型对象作为View方法的第一个参数传递:
...
catch
{
return View(/* here, there must be a model object */);
}
像这样的东西:
...
catch
{
var model = new NewsViewModel();
return View(model);
... or ...
return View(session.Load<NewsViewModel>(....));
}
尝试这个
public int? SelectedId { get; set; }
@Html.DropDownListFor(m => m.SelectedId, Model.Categories, "--Select One--")
[HttpPost]
public ActionResult Create(NewsViewModel newsViewModel)
{
if(ModelState.isValid())
{
try
{
using (var session = NHibernateHelper.OpenSession())
{
using (var tx = session.BeginTransaction())
{
newsViewModel.News.Category.Id = newsViewModel.SelectedId.Value;
session.Save(newsViewModel.News);
tx.Commit();
}
}
return RedirectToAction("Index");
}
catch
{
return View();
}
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.