Asp.net MVC 3: модель пустует в контроллере? - PullRequest
4 голосов
/ 31 января 2012

У меня есть форма, в которой мне нужно выбирать только несколько объектов.

Итак, вот что я сделал:

Создан вид Модель:

    public class EntityChooserModel
    {
        public IEnumerable<Entity> AvailableEntities { get; set; }
        public int SelectedId;
    }

У меня есть два действия в контроллере, одно с [HTTPPost], одно без. В обоих случаях у меня есть «SessionUserData», то есть данные сеанса, связанные через привязку модели данных.

        [Authorize]
        public ActionResult EntityChooser(SessionUserData sessionData)
        {
            List<Entity> entities = _userStore.GetRoles(User.Identity.Name).Select(ur => ur.Entity).ToList();


            Entity entity = sessionData.IdCurrentEntity != null ? entities.Where(e => e.Id == sessionData.IdCurrentEntity).First() : entities.First();

            return View(new EntityChooserModel() { SelectedId = entity.Id, AvailableEntities = entities });
        }

.

    [Authorize]
    [HttpPost]
    public ActionResult EntityChooser( EntityChooserModel model, SessionUserData sessionData, String returnUrl)
    {
        if (ModelState.IsValid)
        {
            Entity entity = _userStore.GetRoles(User.Identity.Name).Select(ur => ur.Entity).Where(e => e.Id == model.SelectedId).First();
            sessionData.IdCurrentEntity = entity.Id;
            RedirectToDefaultPage(returnUrl);
        }
        return View(model);
    }

И строго типизированное представление:

@model My.Full.Namespace.EntityChooserModel
@{
    ViewBag.Title = "EntityChooser";
    Layout = "~/Views/Shared/_LoginLayout.cshtml";
}
<div id="login-wrapper">
    <div id="title">
        <h1>Login</h1>
    </div>
    <div id="login">
        @using (Html.BeginForm("EntityChooser", "Auth", FormMethod.Post, new { id = "ChooseFormId" }))
        {            
            @Html.ValidationSummary(true, "Loggin error")
            <div>
                <span>Choose an entity:</span>
                @Html.DropDownListFor(x => x.SelectedId, new SelectList(Model.AvailableEntities, "Id", "Name"))
            </div>
            <p class="right-aligned">
                <a href="javascript:document.getElementById('ChooseFormId').submit();" class="adm-button">
                    <span class="next-btn"><span>Select</span></span></a>
            </p>
            <input type="submit" style="display: none" />
        }
    </div>
</div>

Проблема в том, что когда я получаю данные во второй модели, у меня пустой объект. Коллекция пуста, а для идентификатора установлено значение по умолчанию (0).

Что не так? Я не могу узнать, что я пропустил в этом.

Впервые я делаю форму mvc, которая не ForModel(), и впервые я использую выпадающий список

1 Ответ

7 голосов
/ 31 января 2012

Единственный входной элемент, который содержит ваш <form>, - это один выпадающий список, который отправляет серверу только выбранное значение при отправке. Это объясняет, почему ваше свойство AvailableEntities collection пусто.

Поскольку поле SelectedId пусто, это потому, что вы определили его как поле , а не как свойство . Связыватель модели по умолчанию работает только со свойствами. Поэтому, если вы хотите, чтобы он был заполнен, вы должны определить его как свойство:

public int SelectedId { get; set; }

Что касается свойства AvailableEntities, вы можете заполнить его из своего хранилища в действии POST, используя выбранный идентификатор.

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