DropDownListFor SelectedValue и отключить использование состояния сеанса - PullRequest
1 голос
/ 03 октября 2011

Я познакомился с Razor применительно к MVC 3 сегодня утром, поэтому, пожалуйста, прости меня, если мой вопрос кажется ужасно неосведомленным!

Я работаю с приложением, рабочий процесс которого позволяет пользователю выбрать значение (склад) из раскрывающегося списка и добавить запись (материал) из этого хранилища в другую запись (Запрос материалов). После того, как первый материал был добавлен в Запрос на материалы, мне нужно навсегда установить значение раскрывающегося списка для склада, который был выбран первым, а затем отключить раскрывающийся элемент управления (или, возможно, установить только для чтения). Существующий код в файле бритвы использует метод DropDownListFor (), включая коллекцию записей хранилища ViewBag. Я видел дискуссии, в которых предлагалось отказаться от дизайна ViewBag, но, честно говоря, у меня нет желания переписывать основные части кода; по крайней мере, это похоже на серьезную переписку с точки зрения моего уровня опыта. Вот оригинальный код:

@Html.LabelPlusFor(m => m.WarehouseId, "*:")
@Html.DropDownListFor(m => m.WarehouseId, (IEnumerable<SelectListItem>)ViewBag.WarehouseCodes, "")<br />

Мне кажется, я смог выбрать значение на основе объекта сеанса, хотя я все еще не уверен, как отключить элемент управления. Вот мое изменение:

    @{ 
        int SelectedWarehouseId = -1;
        if (HttpContext.Current.Session["SelectedWarehouseId"] != null)
        {
            SelectedWarehouseId = Int32.Parse(HttpContext.Current.Session["SelectedWarehouseId"].ToString());
        }
    }
    @Html.LabelPlusFor(m => m.WarehouseId, "*:")
    @{
        if (SelectedWarehouseId > -1)
        {
            @Html.DropDownListFor(m => m.WarehouseId, new SelectList((IEnumerable<SelectListItem>)ViewBag.WarehouseCodes, "WarehouseId", "WarehouseDescription", (int)SelectedWarehouseId))<br />
        }
        else
        {
            @Html.DropDownListFor(m => m.WarehouseId, (IEnumerable<SelectListItem>)ViewBag.WarehouseCodes, "")<br />
        }
    }

Когда материал добавляется в Запрос материала, WarehouseId передается контроллеру, и я могу получить доступ к этому значению как «model.WarehouseId» в классе контроллера. Однако я не уверен, как вернуть это значение в View (извинения за большой блок кода здесь):

    [HttpPost]
    [TmsAuthorize]
    public ActionResult Create(ItemRequestViewModel model)
    {
        string deleteKey = null;
        //Removed code
        else if (Request.Form["AddToRequest"] != null)
        {
            // If the user clicked the Add to Request button, we are only
            // interested in validating the following fields. Therefore,
            // we remove the other fields from the ModelState.
            string[] keys = ModelState.Keys.ToArray();
            foreach (string key in keys)
            {
                if (!_addToRequestFields.Contains(key))
                    ModelState.Remove(key);
            }

            // Validate the Item Number against the database - no sense
            // doing this if the ModelState is already invalid.
            if (ModelState.IsValid)
            {
                _codes.ValidateMaterial("ItemNumber", model.ItemNumber, model.WarehouseId);
                Session["SelectedWarehouseId"] = model.WarehouseId;
            }

            if (ModelState.IsValid)
            {
                // Add the new Item Request to the list
                model.Items.Add(new ItemViewModel() { ItemNumber = model.ItemNumber, Quantity = model.Quantity.Value, WarehouseId = model.WarehouseId });
                ModelState.Clear();
                model.ItemNumber = null;
                model.Quantity = null;
                model.WarehouseId = null;
            }
        }
        //Removed code
        return CreateInternal(model);
    }

    private ActionResult CreateInternal(ItemRequestViewModel model)
    {
        if (model != null)
        {
            if (!String.IsNullOrEmpty(model.SiteId))
            {
                ViewBag.BuildingCodes = _codes.GetBuildingCodes(model.SiteId, false);
                if (!String.IsNullOrEmpty(model.BuildingId))
                    ViewBag.LocationCodes = _codes.GetLocationCodes(model.SiteId, model.BuildingId, false);
            }
            //Removed code
        }
        //Removed code
        ViewBag.WarehouseCodes = _codes.GetWarehouseCodes(false);
        return View("Create", model);
    }

Итак, мои вопросы: как отключить раскрывающийся список и как я могу передать значение для выбранного WarehouseId обратно в представление? Я также рассмотрел возможность добавления значения в ViewBag, но, честно говоря, я недостаточно знаю о ViewBag, чтобы распознать любые непредвиденные последствия, с которыми я могу столкнуться, просто случайно изменив его содержимое.

Спасибо за любую помощь, предлагаемую в этом.

Ответы [ 2 ]

0 голосов
/ 04 октября 2011

когда ваша модель передачи на ваш вид выглядит как

return View("Create", model);

, если WareHouseID установлено в model, тогда

Html.DropDownListFor(x=>x.WareHouseID, ...)

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

new{@readonly = "readOnly"}
0 голосов
/ 04 октября 2011

Не вдаваясь, какой подход лучше ...

Ваш выпадающий список должен отображаться как элемент HTML select , чтобы отключить его, необходимо добавить к нему атрибут disabled="disabled".

Метод DropDownListFor имеет параметр htmlAttributes , который можно использовать для достижения этой цели:

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