MVC с Razor создания выпадающего списка - PullRequest
0 голосов
/ 28 марта 2012

У меня есть следующий код, я могу создать раскрывающийся список, но при отправке я получаю ссылку на объект, не установленную для экземпляра исключения объекта. 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 ]

2 голосов
/ 28 марта 2012

Заполнен ли ваш выпадающий список значениями в вашем запросе на получение?

если да, то при отправке устанавливается ли свойство viewModel m.News.Category.Id с идентификатором значения, выбранного в раскрывающемся списке?

если да, то это не проблема с выпадающим списком ... это как-то связано с сессией NHibernate, которую вы используете ... попробуйте что-то вроде (News) session.Save (newsViewModel.News);

0 голосов
/ 28 марта 2012

Попробуйте это

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();
    }
    }
}
0 голосов
/ 28 марта 2012

Где вы создаете модельный объект?Вы используете 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>(....));
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...