Как использовать Html.DropDownList в строго типизированном представлении для модели, содержащей свойство enullable enum? - PullRequest
1 голос
/ 05 февраля 2011

У меня есть класс модели следующим образом:

namespace MvcApplication1.Models
{
    public enum Sex { Male, Female };
    public class Person
    {
        public int Id { get; set; }
        public string Name { get; set; }

        [Required(ErrorMessage="Please select either Female or Male.")]
        public Sex? Sex { get; set; }
    }
}

Действие Edit делает:

namespace MvcApplication1.Controllers
{
    public class HomeController : Controller
    {
        public ActionResult Edit()
        {
            var Person = new Person { Id = 1, Name = "Someone", Sex = Sex.Male };
            return View(Person);
        }
    }
}

Вопрос 1

Как разметить представление Edit таким образом, что есть раскрывающийся элемент управления, содержащий 3 параметра: "--Выбрать--", "Женский" и "Мужской". Для Person, передаваемого представлению, должен быть выбран "Male".

Вопрос 2

Как создать представление Create и оставить выпадающий элемент управления, выбрав «--Select--» по умолчанию.

Вот действие Create:

 public ActionResult Create()
 {
       var Person = new Person();
       return View(Person);
 }

1 Ответ

3 голосов
/ 05 февраля 2011

Уже есть хороший ответ о том, как преобразовать Enum в список SelectList , но я буду использовать этот встроенный код просто для ответа.

public ActionResult Edit()
{
    var Person = new Person { Id = 1, Name = "Someone", Sex = Sex.Male };
    List<object> values = new List<object>();
    values.Add(new { ID = "choose", Name = "--Select--" });
    values.AddRange(from Sex sex in Enum.GetValues(typeof(Sex))
            select new { ID = sex, Name = sex.ToString() });            
    ViewData["sexes"] = new SelectList(values, "Id", "Name", Person.Sex);
    return View(Person);
}

Теперь представление Edit.cshtml:

@model Test.Models.Person

@{
    ViewBag.Title = "Edit";
    Layout = "~/Views/Shared/_Layout.cshtml";
}

<h2>Edit</h2>

<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>Person</legend>

        @Html.HiddenFor(model => model.Id)

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

        <div class="editor-label">
            @Html.LabelFor(model => model.Sex)
        </div>
        <div class="editor-field">            
            @Html.DropDownListFor(model => model.Sex, (SelectList)ViewData["sexes"])
            @Html.ValidationMessageFor(model => model.Sex)
        </div>

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

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

Теперь управляющее действие для отправки формы:

[HttpPost]
public ActionResult Edit(Person person)
{
    var newName = person.Name;
    var newSex = person.Sex;

    return RedirectToAction("index", "home");
}

Теперь запустите проект в режиме отладки с разрывом на строке return RedirectToAction("index", "home"); в действии после редактирования. Посмотрите, как вы можете изменить значения формы в представлении, а затем сделать то, что вам нужно сделать в опубликованном действии? Существуют и другие варианты, кроме использования ViewData для передачи списка, но они усложняют пример и многочисленны.

Действие Create будет выглядеть так:

public ActionResult Create()
{
    Person person = new Person();
    List<object> values = new List<object>();
    values.Add(new { ID = "choose", Name = "--Select--" });
    values.AddRange(from Sex sex in Enum.GetValues(typeof(Sex))
            select new { ID = sex, Name = sex.ToString() });
    ViewData["sexes"] = new SelectList(values, "Id", "Name");
    return View(person);
}

Элемент списка выбора по умолчанию будет первым, поэтому в качестве выбора по умолчанию будет отображаться "--Select--".

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...