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

В system.web.mvc.dll но не была обработана в пользовательском коде дополнительная информация: нет элемента viewdata типа 'ienumerable<selectlistitem>', который имеет ключ 'state'.


Цитата:
Исключение типа 'System.InvalidOperationException' произошло в System.Web.Mvc.dll но не была обработана в пользовательском коде дополнительная информация: нет элемента ViewData типа 'IEnumerable<selectlistitem>', который имеет ключ 'State'.


вот мой контроллер :-

using ebpassprojects.Models;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using ebpassprojects;
using System.Data.Entity;


namespace ebpassprojects.Controllers
{
    public class ListController : Controller
    {
        // GET: List

        private ApplicationDbContext db = new ApplicationDbContext();
        private void PopulateLookups(ApplicationDbContext db)
        {
            IEnumerable<SelectListItem> item = db.allofcity.Select(C => new SelectListItem
            {
                Value = C.cities,
                Text = C.cities
            }).ToList();

            ViewBag.city= item;

            IEnumerable<SelectListItem> item = db.allofstate.Select(C => new SelectListItem
            {
                Value = C.States,
                Text = C.States
            }).ToList();

            ViewBag.state = item;
        }


    }
}



и мой взгляд :-

<div class="form-group">
               @Html.LabelFor(m => m.State, new { @class = "col-md-2 control-label" })
               <div class="col-md-10">
                   @Html.DropDownListFor(m => m.State, (IEnumerable<SelectListItem>)ViewBag.state, "Select College", new { @class = "form-control" })
               </div>
           </div>
           <div class="form-group">
               @Html.LabelFor(m => m.City, new { @class = "col-md-2 control-label" })
               <div class="col-md-10">
                   @Html.DropDownListFor(m => m.City, (IEnumerable<SelectListItem>)ViewBag.city, "Select College", new { @class = "form-control" })
               </div>
           </div>


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

я попробовал viewdata вместо viewbag но он все еще не показывается

3 Ответов

Рейтинг:
23

Bryian Tan

Ваш код кажется нормальным, очень вероятно, как и указывал @Graeme_Grant, в коде отсутствует атрибут/свойство "состояние" из модели. Вот краткий тест/пример. Я предполагаю, что метод PopulateLookups функционирует, и я думаю, что это так.

1. Создайте очень простой класс, назовем его TestState

public class TestState
    {
        public string State { get; set; }
    }

2. Выберите контроллер/действие, в моем случае я выбрал home/Index
public ActionResult Index()
        {
            PopulateLookups(db);
  
            return View();
        }

3. в индексном представлении добавьте модель сверху и раскрывающийся список под ней
@model WebApplication4.Models.TestState

<div class="form-group">
        @Html.LabelFor(m => m.State, new { @class = "col-md-2 control-label" })
        <div class="col-md-10">
            @Html.DropDownListFor(m => m.State, (IEnumerable<SelectListItem>)ViewBag.state, new { @class = "form-control" })
        </div>
    </div>

4. Запустите приложение, перейдите к индекс дома/, вы должны увидеть элементе dropdownlist с Государственным в нем.

5. Если работа № 4 доказывает, что в вашей текущей модели отсутствует свойство, добавьте свойство состояния в вашу модель, на которое ссылаются в представлении. Если это все еще не работает, опубликуйте больше кода, снова поделитесь с нами моделью/представлением//контроллером/


Himanshu.A.Joshi

я хочу привязать этот выпадающий список на своей странице регистрации

вот мой контроллер

я не знаю, куда я это положил

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

вот мой контроллер страницы регистрации как привязать drpodownlist здесь

// GET: /Account/Register
[Атрибута allowanonymous]
Регистрация общественная ActionResult ()
{


возвращение смотреть();
}

//
// Пост: /аккаунт/зарегистрироваться
[HttpPost]
[Атрибута allowanonymous]
[ValidateAntiForgeryToken]
публичная асинхронная задача<actionresult> Register(модель RegisterViewModel)
{
if (ModelState.Функция IsValid)
{
var user = new ApplicationUser { UserName = model.Электронная почта, электронная почта = модель.Электронная почта };
var result = await UserManager.CreateAsync(пользователь, модель.Пароль);
using (ApplicationDbContext db = new ApplicationDbContext())

если (результат.Преуспевший)
{
ждите SignInManager.SignInAsync(user, isPersistent:false, rememberBrowser:false);

// Для получения дополнительной информации о том, как включить подтверждение учетной записи и сброс пароля, пожалуйста, посетите сайт http://go.microsoft.com/fwlink/?LinkID=320771
// Отправьте электронное письмо с этой ссылкой
// string code = await UserManager.GenerateEmailConfirmationTokenAsync(пользователь.Айди);
/ в / var указанному адресу callbackurl = URL-адрес.Действий("ConfirmEmail", "счет", новый { идентификатор пользователя = Пользователь.Id, code = code }, протокол: Request.Url.Scheme);
// await UserManager.SendEmailAsync(пользователь.ИД "подтвердить свой аккаунт", "Пожалуйста, подтвердите свой аккаунт, нажав на <а href=\"" + по указанному адресу callbackurl + "\"&ГТ;вот");

return RedirectToAction("Index", "Home");
}
AddErrors(результат);
}

// Если мы зашли так далеко, то что-то не получилось, повторная форма отображения
обратный вид(модель);
}

Bryian Tan

Хорошо,
1. Где находится код вызова PopulateLookups установить Viewbag? Я не видел его в Register() и Register(RegisterViewModel model)
2. Есть ли в RegisterViewModel государственная собственность ?

Himanshu.A.Joshi

спасибо за вашу помощь , я только что решил эту проблему

Рейтинг:
10

Graeme_Grant

Публикуем этот рабочий пример из предыдущего сеанса поддержки вопросов и ответов. Принцип все тот же:

1. Модель Данных:

public class DataModel
{
    public Queue<List<string>> Data { get; set; } 
        = new Queue<List<string>>();
}
2. Контроллер
public class HomeController : Controller
{
    public ActionResult Index()
    {
        var results = new DataModel();
        for (int i = 0; i < 10; i++)
        {
            results.Data.Enqueue(new List<string>() { "aaa", "bbb", "ccc" });
        }
        return View(results.Data);
    }
}
2. Просмотр
@{
    ViewBag.Title = "Queue Data Test";
}
@Model = IEnumerable<List<string>>;
<div>
    @foreach (var item in Model)
    {
        <p> data: 
        @string.Join(", ", item);
        </p>
    }
</div>


Himanshu.A.Joshi

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

Graeme_Grant

Это основное Программирование MVC. В этом примере нет ничего сложного. В контроллере я заполняю свойство модели значениями, А затем передаю его в представление. Затем представление объявляет модель (включая проверку Intellisense и компилятора) и выполняет итерацию по коллекции для отображения значений.

Запустите новый проект, добавьте код и запустите его. Используйте точки останова с отладчиком и шагайте через код, чтобы увидеть, как он работает.

Himanshu.A.Joshi

сделав это , я получил решение своей вышеприведенной проблемы

посмотри, что я наделал.

вместо использования IEnumerable<selectlistitem> Я использовал

простая процедура выбора списка

и ввиду этого я также изменил его на

@HTML-код.DropDownListFor(м =&ГТ; м. Государств, (список<selectlistitem&ГТ;)ViewBag.состояние "выберите состояние", новые { @класс = "форма контроля" })


теперь я получаю все состояния...наконец

Graeme_Grant

Боксировать[^] (List<selectlistitem>)ViewBag.state имеет дорогостоящие накладные расходы и не рекомендуется для веб-сайтов... Google SEO оценивает вас за каждую миллисекунду, которую занимает загрузка вашей страницы. Вот почему я сдал экзамен. Сильный Тип[^].

Graeme_Grant

Вот более подробная информация о: Google ранжирует сайт по времени загрузки страницы[^]

Himanshu.A.Joshi

у меня есть один вопрос

я делаю свой проект с индиуальной аутентификацией mvc

здесь он использует indentitiy и все такое прочее

я добавил несколько дополнительных полей в созданную по умолчанию базу данных с помощью code first migration.

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

я не знаю, как это сделать в этом индивидуальном аутентифицированном приложении по умолчанию

Graeme_Grant

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

Рейтинг:
0

Graeme_Grant

IEnumerable<SelectListItem> itenn = ...
ViewBag.state = itenn;
Орфографическая ошибка.. itenn должно бытьitem

Кроме того, вы изменили свойство с State к Value & Text (?) здесь:
Enumerable<SelectListItem> itenn = db.allofstate.Select(C => new SelectListItem
            {
                Value = C.States,
                Text = C.States
            }).ToList();


Himanshu.A.Joshi

я сделал то, что вы сказали, но все еще получаю ту же ошибку

Graeme_Grant

Да, я вижу это. Представление пытается получить доступ к модели, а не к значению ViewBag.

Вы используете:

ViewBag.state = itenn;
когда вы должны использовать:
return View(item);
- это передает модель в представление.

Himanshu.A.Joshi

когда я использую
вид возврата(пункт);

он говорит, что поскольку 'listcontroller.populatelookups(ApplicationdbContext) retuns void, возвращаемое ключевое слово не должно сопровождаться выражением объекта

Graeme_Grant

Вы пробовали погуглить сообщение об ошибке, как я только что сделал? возвращаемое ключевое слово не должно сопровождаться выражением объекта - поиск Google[^]

Да, именно поэтому:Скрыть   скопировать код

private void PopulateLookups(ApplicationDbContext db)
Я отвечаю Вам в промежутке между компиляцией и запуском тестов против кода... Я дал вам много информации, чтобы исправить это, вам просто нужно сделать работу сейчас.

Himanshu.A.Joshi

да я много чего перепробовал искал в гугле

я уже пробовал этот метод

[HttpGet]
Регистрация общественная ActionResult(олстейт-Т)
{
using (ApplicationDbContext db = new ApplicationDbContext())
{
ViewBag.state = db.allofstate.Select(C => new SelectListItem
{
Значение = C. Состояния,
Текст = C. Государства
}).Список();
}

возвращение смотреть();
}


но все равно получаю ту же ошибку

Graeme_Grant

Вот в чем ваша проблема:

return View();
вы возвращаете null вместо модели, как я указывал выше. Пожалуйста, найдите время, чтобы вернуться и внимательно прочитать то, что я написал.

Himanshu.A.Joshi

публичный регистр ActionResult(ApplicationDbContext db)
{
IEnumerable<selectlistitem> item = db.allofstate.Select(C => new SelectListItem
{
Значение = C. Состояния,
Текст = C. Государства
}).Список();



вид возврата(пункт);
}

все еще не работает