Himanshu.A.Joshi Ответов: 1

Я получаю ошибку здесь нет элемента viewdata типа ' ienumerable & lt;selectlistitem> dropdownlistfor


когда я пытаюсь сохранить данные из dropdownlist, он показывает следующую ошибку: - здесь нет элемента viewdata типа ' ienumerable dropdownlistfor

вот, y контроллер

[HttpGet]
        public ActionResult register(tbl_state t)
        {
            eBusPassSystemEntities db = new eBusPassSystemEntities();
            IEnumerable<SelectListItem> item = db.tbl_state.Select(C => new SelectListItem
            {
                Value = C.state_name,
                Text = C.state_name

            });
            ViewBag.state = item;
            return View();
        }



 [HttpPost]
        public ActionResult Register(tbl_user u)
        {
            if (ModelState.IsValid)
            {
                using (eBusPassSystemEntities Db = new eBusPassSystemEntities())

                {
                    Db.tbl_user.Add(u);
                    Db.SaveChanges();

                }
                ModelState.Clear();
                ViewBag.message = "Hello" + u.name + " Your Account Has been Succesfully created.";
            }
            return View();
        }
    }
}


вот мой взгляд

<div class="col-md-10">
                @Html.DropDownListFor(Model => Model.state, (IEnumerable<SelectListItem>)ViewBag.state, "Select state", new { @class = "form-control" })
                @Html.ValidationMessageFor(model => model.state, "", new { @class = "text-danger" })
            </div>


Что я уже пробовал:

я правильно получаю данные dropdownlist, я пытался, но не могу сохранить данные ,

в основном я пытаюсь извлечь состояние из таблицы и хочу сохранить состояние в таблице регистров.

Richard Deeming

Ты уверен, что наезд на правильные действия? У тебя нет другого register действие без неиспользуемого параметра?

Попробуйте установить точку останова в register действие и отладка вашего кода. Ломается ли отладчик внутри этого действия?

Richard Deeming

Я вижу, вы обновили свой вопрос.

Вы получаете ошибку при первой загрузке страницы или только после отправки формы?

(Я предполагаю, что это происходит только тогда, когда вы отправляете форму.)

Himanshu.A.Joshi

только после отправки

Himanshu.A.Joshi

помогите мне plzz, я пытаюсь решить эту проблему с двух дней , я новичок в mvc

Himanshu.A.Joshi

я попробовал, как вы сказали в post bak [httppost]
(
IEnumerable & lt;selectlistitem & gt; item = db.tbl_state.Select (C => new SelectListItem
{
Значение = С. state_name,
Текст = С. state_name
});

ViewBag.состояние = товар;
)
но все равно получаю ошибку в момент подачи формы:-
Исключение типа "система".ObjectDisposedException ' произошло в EntityFramework.dll, но не был обработан в пользовательском коде

Дополнительная информация: экземпляр ObjectContext был удален и больше не может использоваться для операций, требующих подключения.

Richard Deeming

Вы пытаетесь использовать eBusPassSystemEntities экземпляр после того, как он был утилизирован. Это не должно быть возможно с кодом, который я опубликовал.

Himanshu.A.Joshi

так что же мне нужно для этого сделать?
вот я этот проект я использую entity framework

Richard Deeming

Попробуйте обновленный код из моего ответа.

Himanshu.A.Joshi

ладно я пытаюсь

Himanshu.A.Joshi

я попробовал ваш последний обновленный код: - но теперь он получает ошибку перед загрузкой страницы
все еще получаю ту же ошибку

ошибка:-
Исключение типа "система".ObjectDisposedException ' произошло в EntityFramework.dll, но не был обработан в пользовательском коде

Дополнительная информация: экземпляр ObjectContext был удален и больше не может использоваться для операций, требующих подключения.

Richard Deeming

А вы пробовали именно так код, который я отправил?

Или вы изменили его?

Himanshu.A.Joshi

именно тот код, который вы опубликовали

Richard Deeming

Ах, извините - вам нужен .ToList() в запросе, в котором перечислены раскрывающиеся элементы.

Попробуйте обновленный код.

Himanshu.A.Joshi

ожидал куда?

Richard Deeming

Я обновил код в своем вопросе.

ViewBag.state = db.tbl_state.Select(C => new SelectListItem
{
    Value = C.state_name,
    Text = C.state_name
}).ToList();

Himanshu.A.Joshi

Большое большое спасибо, дорогая, ты спасла мой день, большое спасибо

ну, я новичок в mvc , я делаю этот проект в течение 10 дней, и мне нужно завершить его до 10 марта

это на ebuspassregistration and renewal system with online paymnent, я не знаю, как я это сделаю , но вы дали мне уверенность , я изучаю mvc из youtube и других онлайн-источников
у меня есть один вопрос
не могли бы вы сказать, пожалуйста, вот так, если мне нужно обновить город и штат как из выпадающего списка, какие вещи мне нужно добавить?

еще раз спасибо Мистер Ричард

Richard Deeming

Вам нужно будет поместить список городов в ViewBag также:

ViewBag.city = db.tbl_city.Select(C => new SelectListItem
{
    Value = C.city_name,
    Text = C.city_name
}).ToList();

А потом использовать его вместе с DropDownListFor помощник:
@Html.DropDownListFor(Model => Model.city, (IEnumerable<SelectListItem>)ViewBag.city, "Select city", new { @class = "form-control" })

Я бы определенно рекомендовал использовать отдельный метод для заполнения поисковых запросов, как во втором и третьем образцах моего ответа. Таким образом, вам нужно только добавить ViewBag код один раз. :)

Himanshu.A.Joshi

Эй, Ричард, как мне добраться до штата мудрый город?

1 Ответов

Рейтинг:
12

Richard Deeming

Предметы в ViewBag присутствуют только по одному запросу. Когда вы отправляете форму, она обрабатывается другим действием. Это действие возвращает то же самое представление, но не повторно заполняет требуемое ViewBag предметы.

Простой подход заключается в повторном заполнении ViewBag В вашем HttpPost действие:

[HttpGet]
public ActionResult register(tbl_state t)
{
    using (eBusPassSystemEntities db = new eBusPassSystemEntities())
    {
        ViewBag.state = db.tbl_state.Select(C => new SelectListItem
        {
            Value = C.state_name,
            Text = C.state_name
        }).ToList();
    }
    
    return View();
}

[HttpPost]
public ActionResult Register(tbl_user u)
{
    if (ModelState.IsValid)
    {
        using (eBusPassSystemEntities Db = new eBusPassSystemEntities())
        {
            Db.tbl_user.Add(u);
            Db.SaveChanges();
        }
        
        ModelState.Clear();
        ViewBag.message = "Hello" + u.name + " Your Account Has been Succesfully created.";
    }
    
    using (eBusPassSystemEntities db = new eBusPassSystemEntities())
    {
        ViewBag.state = db.tbl_state.Select(C => new SelectListItem
        {
            Value = C.state_name,
            Text = C.state_name
        }).ToList();
    }
    
    return View();
}

Вы можете переместить популяцию в отдельный метод, чтобы избежать дублирования кода:
private void PopulateLookups(eBusPassSystemEntities db)
{
    ViewBag.state = db.tbl_state.Select(C => new SelectListItem
    {
        Value = C.state_name,
        Text = C.state_name
    }).ToList();
}

[HttpGet]
public ActionResult register(tbl_state t)
{
    using (eBusPassSystemEntities db = new eBusPassSystemEntities())
    {
        PopulateLookups(db);
    }
    
    return View();
}

[HttpPost]
public ActionResult Register(tbl_user u)
{
    if (ModelState.IsValid)
    {
        using (eBusPassSystemEntities Db = new eBusPassSystemEntities())
        {
            Db.tbl_user.Add(u);
            Db.SaveChanges();
        }
        
        ModelState.Clear();
        ViewBag.message = "Hello" + u.name + " Your Account Has been Succesfully created.";
    }
    
    using (eBusPassSystemEntities db = new eBusPassSystemEntities())
    {
        PopulateLookups(db);
    }
    
    return View();
}

Но обычно после выполнения операции вставки / обновления/удаления вы хотите перенаправить пользователя на другое действие. Таким образом, если они нажмут кнопку "Обновить" браузера, он не будет пытаться выполнить то же самое действие снова.
private void PopulateLookups(eBusPassSystemEntities db)
{
    ViewBag.state = db.tbl_state.Select(C => new SelectListItem
    {
        Value = C.state_name,
        Text = C.state_name
    }).ToList();
}

[HttpGet]
public ActionResult register(tbl_state t)
{
    using (eBusPassSystemEntities db = new eBusPassSystemEntities())
    {
        PopulateLookups(db);
    }
    
    return View();
}

[HttpPost]
public ActionResult Register(tbl_user u)
{
    if (!ModelState.IsValid)
    {
        using (eBusPassSystemEntities db = new eBusPassSystemEntities())
        {
            PopulateLookups(db);
        }
        
        return View();
    }
    
    using (eBusPassSystemEntities Db = new eBusPassSystemEntities())
    {
        Db.tbl_user.Add(u);
        Db.SaveChanges();
    }
    
    TempData["message"] = "Hello" + u.name + " Your Account Has been Succesfully created.";
    return RedirectToAction("Success");
}

[HttpGet]
public ActionResult Success()
{
    ViewBag.message = TempData["message"];
    return View();
}