Списки поиска с NHibernate и ASP.Net MVC - PullRequest
0 голосов
/ 24 июня 2009

Я не могу получить значение списка выбора, чтобы заполнить значение родительского объекта. Я использую объект-обертку для привязки, чтобы у меня был доступ к значениям, необходимым для SelectList, а также к объекту, которому необходимо это значение. Готов поспорить, что упускаю что-то простое, но не могу найти.

У меня есть эти модели:

    public class Status
    {
        public virtual int Id { get; protected set; }
        public virtual string Name { get; set; }
        public virtual bool IsClosed { get; set; }

        public override string ToString()
        {
            return Name;
        }
    }
    public class Issue
    {
        public virtual int Id { get; protected set; }
        public virtual string Title { get; set; }
        public virtual string Description { get; set; }
        public virtual Status Status { get; set; }
        public virtual DateTime CreatedOn { get; set; }
        public virtual DateTime UpdatedOn { get; set; }

    }

И FormViewModel (из примеров NerdDinner), чтобы содержать список статусов

    public class IssueFormViewModel
    {
        public Issue Issue { get;  set; }
        public SelectList Statuses { get;  set; }
        public IssueFormViewModel(Issue issue, IList<Status> statuses)
        {
            Issue = issue;
            Statuses = new SelectList(statuses, "Id", "Name", statuses[1].Id );
        }

        public IssueFormViewModel() { }

    }

Мои действия по созданию на контроллере выглядят как ...

    public ActionResult Create()
    {
        IList<Status> statuses;
        Issue issue = new Issue();
        // NHibernate stuff getting a List<Status>
        return View(new IssueFormViewModel(issue,statuses));
    } 
    [AcceptVerbs(HttpVerbs.Post)]
    public ActionResult Create(IssueFormViewModel issueFormView)
    { // At this point issueFormView.Issue.Status == null
      // ...
    }

Мой объект Issue связан частично, кроме статуса, используя эти имена в представлении:

<p>
            <label for="Issue.Title">Title:</label>
            <%= Html.TextBox("Issue.Title", Model.Issue.Title)%>
            <%= Html.ValidationMessage("Title", "*") %>
        </p>
<p>
            <label for="Statuses">Status:</label>
            <!-- also tried "Issue.Status" -->
            <%= Html.DropDownList("Statuses", Model.Statuses)%>
            <%= Html.ValidationMessage("Status", "*")%>
        </p>

Ответы [ 2 ]

0 голосов
/ 24 июня 2009

Как и ожидалось - это было что-то простое.

Я изменил вид, чтобы выглядеть так:

    <label for="Status.Id">Status:</label>
    <%= Html.DropDownList("Status.Id", Model.Statuses)%>
    <%= Html.ValidationMessage("Status.Id", "*")%>

и подпись контроллера для «выдачи» (не может быть привязана к списку выбора!)

    [AcceptVerbs(HttpVerbs.Post)]
    //public ActionResult Create(IssueFormViewModel issueFormView)
    public ActionResult Create(Issue issueToAdd)
    {

И в моем действии Post-Create у меня есть проблема со статусом. Хотя статус недействителен (он содержит только Id). Поэтому, перед тем как отправлять Issue в базу данных, я задаю IssueToAdd следующим образом:

    issueToAdd.Status = (from p in GetAllStatuses() 
                         where p.Id == issueToAdd.Status.Id 
                         select p).First();

Редактировать: И оказывается, что мне даже не нужно было выбирать "правильный" объект Status. Это связано с Id, и это достаточно хорошо.

0 голосов
/ 24 июня 2009

Я попробовал выпадающий список на моем компьютере, и он работает, вы должны убедиться, что NHibernate возвращает более 1 элемента, так как ваш код пытается установить выбранный элемент как второй элемент.

Statuses = new SelectList(statuses, "Id", "Name", statuses[1].Id);

Помните, что списки индексируются на основе нуля.

...