Как получить выбранные значения флажка в форме mvc3?

#asp.net-mvc-3 #checkbox

#asp.net-mvc-3 #флажок

Вопрос:

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

Форма, имеющая,

  1. Имя
  2. Дата рождения
  3. Поместите
  4. Интересы (список флажков)

У меня есть модель, в которой есть все поля Name, BirthDay, Place. И еще одна модель для LookingFormodel.

Теперь, когда я отправляю форму. все поля, такие как name, Birthday и palce, отправляются в модель, но я не получаю список выбранных флажком элементов.

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

Комментарии:

1. Можете ли вы показать нам какой-нибудь код? ASP.NET MVC 3 прекрасно умеет автоматически сопоставлять поля вашей формы с моделью. Поскольку все дело в списке интересов, пожалуйста, покажите соответствующие части представления и модели.

Ответ №1:

Это кажется хорошим кандидатом для шаблонов редактора. Как всегда, мы начинаем с разработки модели представления:

 public class MyViewModel
{
    public string Name { get; set; }
    [DisplayFormat(DataFormatString = "{0:dd/MM/yyyy}", ApplyFormatInEditMode = true)]
    public DateTime? DateOfBirth { get; set; }
    public string Place { get; set; }
    public IEnumerable<InterestViewModel> Interests { get; set; }
}

public class InterestViewModel
{
    public int Id { get; set; }
    public string InterestLabel { get; set; }
    public bool IsSelected { get; set; }
}
  

затем контроллер:

 public class HomeController : Controller
{
    public ActionResult Index()
    {
        var model = new MyViewModel
        {
            Name = "john",
            DateOfBirth = new DateTime(1990, 1, 1),
            Place = "Spain",
            Interests = new[]
            {
                new InterestViewModel { Id = 1, InterestLabel = "cinema" },
                new InterestViewModel { Id = 2, InterestLabel = "sport" },
                new InterestViewModel { Id = 3, InterestLabel = "books" },
            }
        };
        return View(model);
    }

    [HttpPost]
    public ActionResult Index(MyViewModel model)
    {
        // TODO: process the results here, the view model will be
        // correctly bound
        ....
    }
}
  

затем view ( ~/Views/Home/Index.cshtml )

 @model MyViewModel

@using (Html.BeginForm())
{
    <div>
        @Html.LabelFor(x => x.Name)
        @Html.EditorFor(x => x.Name)
    </div>
    <div>
        @Html.LabelFor(x => x.DateOfBirth)
        @Html.EditorFor(x => x.DateOfBirth)
    </div>
    <div>
        @Html.LabelFor(x => x.Place)
        @Html.EditorFor(x => x.Place)
    </div>
    <h2>Interests</h2>
    @Html.EditorFor(x => x.Interests)

    <button type="submit">OK</button>
}
  

и соответствующий шаблон редактора, который будет отображаться для каждого элемента коллекции интересов ( ~/Views/Home/EditorTemplates/InterestViewModel.cshtml ):

 @model InterestViewModel

@Html.LabelFor(x => x.IsSelected, Model.InterestLabel)
@Html.CheckBoxFor(x => x.IsSelected)
@Html.HiddenFor(x => x.Id)
@Html.HiddenFor(x => x.InterestLabel)
  

Комментарии:

1. привет, как вы ссылаетесь InterestViewModel.cshtml на Index.cshtml то, что я точно следую тому, что вы сказали, но я получаю только значения вместо флажков.. чего мне не хватает??

2. Это работает по соглашению: внутри модели представления Interests свойство имеет тип IEnumerable<InterestViewModel> => asp.net mvc будет искать файл /Views/Shared/EditorTemplates/InterestViewModel.cshtml , потому что это имя типа, используемое в коллекции.

3. да, точно, спасибо .. всего секунду назад я искал, что EditorTemplates я не знал об этом..