MVC与Razor创建下拉列表

时间:2012-03-27 21:57:08

标签: c# asp.net-mvc-3 razor drop-down-menu

我有以下代码,我能够创建一个下拉列表,但是当我提交时,我得到的Object引用没有设置为对象异常的实例。 News类有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);

时遇到异常

3 个答案:

答案 0 :(得分:2)

您的下拉列表是否在获取请求中填充了值?

如果是,则在提交时,viewModel的m.News.Category.Id属性是否设置了您在下拉列表中选择的值的ID?

如果是,那么它不是下拉列表的问题......它与您正在使用的NHibernate会话有关...尝试类似(新闻)session.Save(newsViewModel.News);

答案 1 :(得分:0)

您在哪里创建模型对象?您在视图中使用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>(....));
    }

答案 2 :(得分:0)

试试这个

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();
    }
    }
}