Я познакомился с 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, чтобы распознать любые непредвиденные последствия, с которыми я могу столкнуться, просто случайно изменив его содержимое.
Спасибо за любую помощь, предлагаемую в этом.