2014-02-19 3 views
0

Выпадающее меню вытягивает и отображает правильный список, однако после его выбора я нажимаю кнопку «Сохранить», и выбранная опция игнорируется, и еще раз значение пустое.Как сохранить список выпадающего списка обратно в базу данных

// получить

public ActionResult Edit(int id) 
{ 
    Prospect prospect = db.Prospects.Find(id); 
    if (prospect == null) 
    { 
     return HttpNotFound(); 
    } 
    ViewBag.ProductID = new SelectList(db.Products, "ProductID", "Name", prospect.Product); 
    return View(prospect); 
} 

// размещать

[HttpPost] 
    public ActionResult Edit(Prospect prospect) 
    { 
     if (ModelState.IsValid) 
     { 
      db.Entry(prospect).State = EntityState.Modified; 
      db.SaveChanges(); 
      return RedirectToAction("Index"); 
     } 
     ViewBag.ProductID = new SelectList(db.Products, "ProductID", "Name", prospect.Product); 
     return View(prospect); 
    } 

// вид

<div class="editor-label"> 
     @Html.LabelFor(model => model.Product) 
    </div> 
    <div class="editor-field"> 
     @Html.DropDownList("ProductId", String.Empty) 
     @Html.ValidationMessageFor(model => model.Product) 
    </div> 

Любая помощь будет принята с благодарностью

+0

Можете ли вы показать, что является вашим «Проспектом»? – Dmytro

ответ

4

только для помощников (кроме дисплея) привязаны к модели. измените свой раскрывающийся список на

@Html.DropDownListFor(x => x.ProductID, (SelectList)ViewBag.ProductID) 

где ProductID - любое значение в вашей модели, к которой вы хотите привязать выделенный элемент. Вы также установить падение вниз таким образом, установив это значение, прежде чем передать его мнению

Update:

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

Добавить список в модель

public List<SelectListItem> Products { get; set; } 

затем на контроллере заполнить этот список из базы данных. Маффин сделал один из способов сделать это. Мы получаем доступ наших данных по-разному, так что я заполнение моего списка с Еогеаспом

var products = //populate the list from your database 
List<SelectListItem> ls = new List<SelectListItem>(); 
foreach(var temp in products){ 
    ls.Add(new SelectListItem() { Text = temp.ProductName, Value = temp.ProductID }); 
} 
Model.Products = ls; // set the list in your model to the select list you just built 

затем на вашем взгляде, вместо литья списка вида сумки в список выбора вы можете просто ссылаться на список из модели

@Html.DropDownListFor(x => x.ProductID, Model.Products) 
+0

Удивительно, спасибо за ваше время, также спасибо вам за других участников, я изначально получил ошибку, пропустив «За» в выпадающем списке и перешел на Muffin Man's, однако после минуты я полностью потерялся и, к счастью, увидел дополнительную " Для'. Еще раз спасибо всем и у нас отличный день. –

+0

Этот ответ неаккуратный. Вы не указали общее решение, которое вы предоставили. Если Мэтт хочет уточнить свой ответ, чтобы дать вам советы по лучшей практике, я буду рад удалить проголосовавший голос. –

+0

@ TheMuffinMan Я не уверен, как ответ, который использует настройки, которые у него есть, и исправляет его проблему, неаккуратно. Я полностью согласен с тем, как вы настраиваете свой ответ (мой - это ответ на ваш ответ). В соответствии с просьбой я дал предложение о лучшем способе сделать это. –

0

Насколько я знаю, RedirectToAction отправит HTTP 302 повторно прямой запрос в браузер, и никакие заявления ниже, которые будут выполнены. Поскольку ASP.NET MVC не будет поддерживать состояние элементов управления, таких как обычные веб-формы ASP.NET, вы получаете пустое значение.

+0

Этот ответ не имеет большого значения и должен быть комментарием. –

1

Нельзя привязывать свой вид непосредственно к типу таблицы базы данных. Используйте модель представления. Кроме того, этот тип данных принадлежит вашей модели просмотра, а не сумке. Сумка для просмотра отлично подходит для обмена такими вещами, как название страницы между вашим видом и страницей макета.

public class ProspectViewModel 
{ 
    public IEnumerable<SelectListItem> ProspectList { get; set; } 

    [DisplayName("Product")] //This is for our label 
    public int SelectedProspectId { get; set; } 
} 

Получить

public ActionResult Edit(int id) 
{ 
    var prospect = db.Prospects.Find(id); 
    if (prospect == null) 
    { 
     return HttpNotFound(); 
    } 

    var model = new ProspectViewModel 
        { 
         ProductList = db.Products.Select(x=> new SelectListItem { ... }) 
        }; 

    return View(model); 
} 

Сообщение

[HttpPost] 
public ActionResult Edit(ProspectViewModel model) 
{ 
    if (ModelState.IsValid) 
    { 
     var prospect = new Prospect { /* populate with values from model */ }; 
     db.Prospects.Attach(prospect); 
     db.Entry(prospect).State = EntityState.Modified; 
     db.SaveChanges(); 
     return RedirectToAction("Index"); 
    } 
    //Need to repopulate drop down list 
    //And we don't need to set SelectedProductId because it's already been posted back 
    model.ProductList = db.Products.Select(x=> new SelectListItem { ... }); 

    return View(model); 
} 

Посмотреть

<div class="editor-label"> 
    @Html.LabelFor(model => model.SelectedProductId) 
</div> 
<div class="editor-field"> 
    @Html.DropDownListFor(x=> x.SelectedProductId, Model.ProductList) 
    @Html.ValidationMessageFor(x=> x.SelectedProductId) 
</div> 

Это выходит за рамки этого ответа, но вы не должны делать доступа к данным в пределах ваш контроллер. Примеры Microsoft показывают это, потому что они предназначены для примеров «Hello world», которые не обязательно должны восприниматься буквально.

Смежные вопросы