Как мне показать checkboxlist в asp.net mvc3? - PullRequest
0 голосов
/ 29 июля 2011

У меня есть таблица издателей, и у меня есть таблица заголовков.Я использую Entity Framework v4.1.У сущности издателя есть свойство title, и оно указывает, сколько изданий опубликовал данный конкретный издатель (я использую базу данных pubs).Я хочу создать список флажков, в котором отображаются все заголовки (все записи таблицы заголовков) и должны быть проверены заголовки, опубликованные этим издателем.Как я могу это сделать?

Пока я могу создать только DropDownlist, используя этот код:

<tr>
            <td>
                Titles
            </td>
            <td>
                @Html.DropDownListFor(p => p.titles.ToList()[0], new SelectList(ViewBag.titles, "title_id", "notes"))
            </td>
        </tr>

Как я могу преобразовать это в список флажков?

Заранее спасибо:)

РЕДАКТИРОВАТЬ: После прочтения Brian's сообщения, я добился определенного прогресса, однако при отправке формы не найдено никаких значений:

Я создалчастичный класс заголовка:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;

namespace MVCWebApp.Models
{
    public partial class title
    {

        public int Id { get; set; }
        public bool IsChecked { get; set; }
    }
}

Это мой EditorTemplate для флажка:

<%@ Control Language="C#" Inherits="System.Web.Mvc.ViewUserControl<MVCWebApp.Models.title>" %>

<%= Html.HiddenFor(x => x.Id)%>
<%= Html.CheckBoxFor(x => x.IsChecked)%>
<%= Html.DisplayFor(x => x.title1)%>
<br />

Со страницы, где мне нужен флажок, я написал этот код:

 <td>
                @Html.EditorFor(p => ViewData["titles"])
            </td>

Это фактический (крайне неэффективный из-за вложенного цикла) метод контроллера, который отображает страницу:

 public ActionResult Edit(string id)
        {
            using (PubsEntities entities = new PubsEntities())
            {
                publisher pub = entities.publishers.Include("titles").Where(p => p.pub_id == id).First();
                List<title> titles = entities.titles.ToList();
                foreach (var item in pub.titles)
                {
                   title tit = (from titleItem in titles where item.pub_id == titleItem.pub_id select item).First();
                    tit.IsChecked = true;
                }
                ViewData["titles"] = titles;
                return View(pub);
            }
        }

Я получаю основной список заголовков, и эти заголовки, опубликованные определенным издателем, проверяются.Однако при публикации формы все значения равны null

Это мой метод обновления, при котором форма публикуется:

 public ActionResult Update(publisher modifiedPub, List<title> selectedTitle )
        {
            if (!ModelState.IsValid)
                return View("Edit", modifiedPub);

            using (PubsEntities entities = new PubsEntities())
            {

                publisher pub = entities.publishers.Where(p => p.pub_id == modifiedPub.pub_id).First();
                pub.pub_name = modifiedPub.pub_name;
                pub.state = modifiedPub.state;

                entities.SaveChanges();
                return RedirectToAction("Publishers");
            }
        }

Здесь selectedTitle имеет значение null идаже в ModifiedPub.titles счетчик равен 0. Кто-нибудь может сказать мне, где это неправильно?

Заранее спасибо:)

PS: Неужели нам действительно нужно сделать так много, чтобы получить чекбокс?

1 Ответ

1 голос
/ 29 июля 2011

Ваша проблема в следующей строке:

@Html.EditorFor(p => ViewData["titles"])

Каждый раз, когда вы используете ключевые слова ViewData/ViewBag в приложении ASP.NET MVC, у вас будут проблемы.Правильный способ сделать это - использовать модель представления.В этой модели представления у вас будет свойство Titles, которое будет коллекцией того типа, который вы определили.И, на ваш взгляд, вы просто:

@Html.EditorFor(p => p.Titles)

Это, конечно, будет означать, что вам придется изменить действие контроллера Edit, чтобы вместо возврата этой модели домена pub к представлению, которое он используетваша реальная модель реального вида.

Например:

public class TitleViewModel
{
    public int Id { get; set; }
    public bool IsChecked { get; set; }
}

public class PublisherViewModel
{
    public IEnumerable<TitleViewModel> Titles { get; set; }

    ... some other properties of a publisher that you want to work on in your view    
}

и контроллер:

public ActionResult Edit(string id)
{
    var publisher = _service.GetPublisher(id);

    var viewModel = new PublisherViewModel
    {
        Titles = publisher.Titles.Select(x => new TitleViewModel
        {
            Id = x.Name,
            IsChecked = true
        })
    };

    return View(model);
}

[HttpPost]
public ActionResult Update(PublisherViewModel model)
{
    if (!ModelState.IsValid)    
    {
        return View(model);
    }

    var publisher = ... map the view model to a domain model
    _service.UpdatePublisher(publisher);

    return RedirectToAction("Publishers");
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...