MVC Выберите список с моделью при обратной передаче, как? - PullRequest
4 голосов
/ 05 января 2012

Я пытаюсь создать представление, которое будет нуждаться в 2 раскрывающихся списках с MVC 3. В моем единственном другом приложении MVC мы использовали элементы управления Telerik, которые использовали метод Ajax для заполнения данных. Сейчас в этом проекте мы не используем сторонние элементы управления, поэтому я буду использовать MVC SelectList для выпадающих списков. Я читал много статей о том, как заполнить SelectList, но ни одна из них не говорит одно и то же дважды, всегда другой способ создания модели, некоторые используют ViewData или ViewBag для хранения коллекций и перейти к представлению и т. д. нет последовательности.

Каков наиболее приемлемый метод для заполнения раскрывающегося списка в представлении MVC, в котором для данных используется сама модель, а не ViewData. И когда пользователь делает выбор из списка, отправляет и вызывается действие HttpPost, как я могу получить доступ к выбранному значению из свойства Model свойства select list?

Это моя текущая модель:

public class TemporaryRegistration {
    [Required]
    [Email(ErrorMessage = "Please enter a valid email address.")]
    [Display(Name = "Email address")]
    public string Email { get; set; }

    [Required]
    [Integer]
    [Min(1, ErrorMessage = "Please select an entity type.")]
    [Display(Name = "Entity Type")]
    public IEnumerable<SelectListItem> EntityType { get; set; }

    [Required]
    [Integer]
    [Min(1, ErrorMessage = "Please select an associated entity.")]
    [Display(Name = "Associated Entity")]
    public IEnumerable<SelectListItem> AssociatedEntity { get; set; }
}

Это мой текущий вид, он использует только TextBoxFor, где мне нужно использовать выпадающие списки, как мне превратить их в выпадающие списки?

@model Web.Models.TemporaryRegistration

<script src="@Url.Content("~/Scripts/jquery.validate.min.js")" type="text/javascript"></script>
<script src="@Url.Content("~/Scripts/jquery.validate.unobtrusive.min.js")" type="text/javascript"></script>

@using (Html.BeginForm()) {
    @Html.ValidationSummary(true)
    <fieldset>
    <legend>Create New ELM Select User</legend>
        <div class="editor-label">
            @Html.LabelFor(model => model.Email)
        </div>
        <div class="editor-field">
            @Html.EditorFor(model => model.Email)
            @Html.ValidationMessageFor(model => model.Email)
        </div>

        <div class="editor-label">
            @Html.LabelFor(model => model.EntityType)
        </div>
        <div class="editor-field">
            @Html.EditorFor(model => model.EntityType)
            @Html.ValidationMessageFor(model => model.EntityType)
        </div>

        <div class="editor-label">
            @Html.LabelFor(model => model.AssociatedEntity)
        </div>
        <div class="editor-field">
            @Html.EditorFor(model => model.AssociatedEntity)
            @Html.ValidationMessageFor(model => model.AssociatedEntity)
        </div>

        <p>
            <input type="submit" value="Create" />
        </p>
    </fieldset>
}

<div>
    @Html.ActionLink("Back to List", "Index")
</div>

Это мое текущее сообщение: Как вывести выбранные значения?

[HttpPost]
public ActionResult CreateUser(TemporaryRegistration registrationModel) {
    string newRegistrationGUID = string.Empty;
    if (!ModelState.IsValid) {
        return View();
    }

    TemporaryRegistrationEntity temporaryRegistration = null;
    temporaryRegistration = new TemporaryRegistrationEntity(registrationModel.Email, registrationModel.EntityType, registrationModel.AssociatedEntity);
    newRegistrationGUID = temporaryRegistration.Save();
    return Content("New registration was created with GUID " + newRegistrationGUID);
}

Ответы [ 2 ]

8 голосов
/ 06 января 2012

Продолжение комментария ...

Допустим, у вас есть модель с именем Toy. Игрушка обладает свойствами, такими как Name, Price и Category:

public class Toy()
{
    public string Name;
    public double Price;
    public string Category
}

Теперь вы хотите построить форму View, чтобы добавить Toy, и люди должны иметь возможность выбрать категорию из выпадающего списка возможностей ... но вы не хотите делать это с помощью ViewData или ViewBag по какой-то причине.

Вместо передачи модели в представление, создайте ToyViewModel, который имеет Name, Price, Category ... но также имеет коллекцию категорий для заполнения капли вниз:

public class ToyViewModel()
{
    public string Name;
    public double Price;
    public string Category

    public ICollection<string> Categories;
}

Теперь ваш контроллер делает это:

public ActionResult GetToyForm()
{
    var viewModel = new ToyViewModel();
    viewModel.Categories = _service.GetListOfCategories();
    return View(viewModel);
}

Ваш View привязан к ViewModel, и вы используете коллекцию model.Categories для заполнения вашего раскрывающегося списка. Он должен выглядеть примерно так:

@Html.DropDownListFor(model => model.Category, model.Categories)

Когда вы отправляете его, ваш контроллер делает что-то вроде:

[HttpPost]
public ActionResult CreateToy(ToyViewModel _viewModel)
{
    var model = new Toy();
    model.Name = _viewModel.Name
    // etc.

    _service.CreateToy(model);

    // return whatever you like.
    return View();
}

Хорошей практикой является создание ViewModels для привязки к Views, чтобы вы могли адаптировать их к потребностям вашего уровня представления, в то время как ваши Модели остаются близкими к уровню данных и бизнес-логике.

2 голосов
/ 05 января 2012

EntityType не обязательно должен быть списком, если вы не принимаете несколько значений обратно (например, отправляет список). Когда вы отображаете выпадающий список (который обычно выбирает только одно значение) в представлении, вам просто нужно предоставить варианты для него другим способом, например, отправить список в другом свойстве модели представления.

public class TemporaryRegistration {
        [Required]
        [Email(ErrorMessage = "Please enter a valid email address.")]
        [Display(Name = "Email address")]
        public string Email { get; set; }

        [Required]
        [Integer]
        [Min(1, ErrorMessage = "Please select an entity type.")]
        [Display(Name = "Entity Type")]
        public int EntityType { get; set; }

        public IEnumerable<SelectListItem> EntityTypes { get; set; }

        [Required]
        [Integer]
        [Min(1, ErrorMessage = "Please select an associated entity.")]
        [Display(Name = "Associated Entity")]
        public IEnumerable<SelectListItem> AssociatedEntity { get; set; }
}

Затем воспользуйтесь помощником раскрывающегося списка.

@Html.DropDownListFor(model => model.EntityType, model.EntityTypes)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...