Передача параметров раскрывающихся значений MVC ViewBag - PullRequest
1 голос
/ 22 мая 2011

В базе данных есть таблица пользователя и студента. Я сгенерировал модель, используя Entity Framework. Поскольку в этом сгенерированном классе ученика были поля только от ученика, но не от пользователя формы, я создал свой собственный ученический класс со всеми этими полями, которые будут использоваться как viewmodel.

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

ViewBag.Programs = Entities.Programs;

Программы - это учебные программы в университете (например, информатика, юриспруденция и т. Д.) Таким образом, это отношения 1: N, где ученик может участвовать только в одной программе, но программа может изучаться большим количеством учеников. И, на мой взгляд, я использую DropDownFor, чтобы создать выпадающий список, из которого программа назначается студентам, когда новый студент добавляется в базу данных.

<div class="editor-field">
            @Html.DropDownListFor(model => model.ProgramID, ((IEnumerable<SSVN.Models.Program>)ViewBag.Programs).Select(option => new SelectListItem 
       {
        Text = (option == null ? "None" : option.Name), 
        Value = option.ID.ToString(),
        Selected = (Model != null) && (option.ID == Model.ID)
       }), "Choose...")
            @Html.ValidationMessageFor(model => model.ProgramID)
        </div>

Проблема в том, что когда я нажимаю кнопку отправки формы, появляется эта ошибка:

Сведения об исключении: System.ArgumentNullException: значение не может быть нулевым. Имя параметра: источник

@Html.DropDownListFor(model => model.ProgramID, ((IEnumerable<SSVN.Models.Program>)ViewBag.Programs).Select(option => new SelectListItem 

Эта часть model => model.ProgramID делает ошибку

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

РЕДАКТИРОВАТЬ ПОЛУЧИТЬ ДЕЙСТВИЕ

// GET: /Unija/Studenti/Izmeni

        public ActionResult Izmeni(int ID)
        {
            ViewBag.StudProgrami = Entities.Studijski_Program;

            SSVN.ModelView.Student student = new SSVN.ModelView.Student();
            SSVN.Models.Student stud = Entities.Students.Single(x => x.ID == ID);
            Korisnik korisnik = Entities.Korisniks.Single(s => s.ID == ID);
            student.ID = korisnik.ID;
            student.KorisnickoIme = korisnik.Korisnicko_Ime;
            student.Lozinka = korisnik.Lozinka;
            student.Ime = stud.Ime;
            student.Prezime = stud.Prezime;
            student.BrojIndeksa = stud.Broj_Indeksa;
            student.TrenutniSemestar = stud.Trenutni_Semestar;
            student.StudijskiProgramID = stud.Studijski_Program_ID;

            return View(student);
        }

РЕДАКТИРОВАТЬ ПОЧТОВЫЙ ДЕЙСТВИЕ

// POST: /Unija/Studenti/Izmeni

        [HttpPost]
        public ActionResult Izmeni(SSVN.ModelView.Student student)
        {
            if (ModelState.IsValid)
            {
                Korisnik korisnikToUpdate = Entities.Korisniks.Single(x => x.ID == student.ID);
                korisnikToUpdate.Korisnicko_Ime = student.KorisnickoIme;
                korisnikToUpdate.Uloga_ID = Entities.Ulogas.SingleOrDefault(x => x.Naziv == "Student").ID;
                Entities.SaveChanges();

                SSVN.Models.Student studentToUpdate = Entities.Students.Single(x => x.ID == student.ID);
                studentToUpdate.Ime = student.Ime;
                studentToUpdate.Prezime = student.Prezime;
                studentToUpdate.Broj_Indeksa = student.BrojIndeksa;
                studentToUpdate.Trenutni_Semestar = student.TrenutniSemestar;
                studentToUpdate.Studijski_Program_ID = student.StudijskiProgramID;
                Entities.SaveChanges();

                return RedirectToAction("Index");
            }

            return View(student);
        }

VIEW

@model SSVN.ModelView.Student

@{
    ViewBag.Title = "Izmeni";
}

<h2>Dodaj</h2>

<script src="@Url.Content("~/Scripts/jquery.validate.min.js")" type="text/javascript"></script>
<script src="@Url.Content("~/Scripts/jquery.validate.unobtrusive.min.js")" type="text/javascript"></script>

@using (Html.BeginForm()) {
    @Html.ValidationSummary(true)
    <fieldset>
        <legend>Student</legend>

        <div class="hidden-field">
        @Html.HiddenFor(model => model.ID)
        </div>

        <div class="editor-label">
            @Html.LabelFor(model => model.KorisnickoIme)
        </div>
        <div class="editor-field">
            @Html.EditorFor(model => model.KorisnickoIme)
            @Html.ValidationMessageFor(model => model.KorisnickoIme)
        </div>
        <input type="hidden" name="Lozinka" value="lozinka" />
        <div class="editor-label">
            @Html.LabelFor(model => model.Ime)
        </div>
        <div class="editor-field">
            @Html.EditorFor(model => model.Ime)
            @Html.ValidationMessageFor(model => model.Ime)
        </div>

        <div class="editor-label">
            @Html.LabelFor(model => model.Prezime)
        </div>
        <div class="editor-field">
            @Html.EditorFor(model => model.Prezime)
            @Html.ValidationMessageFor(model => model.Prezime)
        </div>

        <div class="editor-label">
            @Html.LabelFor(model => model.BrojIndeksa)
        </div>
        <div class="editor-field">
            @Html.EditorFor(model => model.BrojIndeksa)
            @Html.ValidationMessageFor(model => model.BrojIndeksa)
        </div>

        <div class="editor-label">
            @Html.LabelFor(model => model.TrenutniSemestar)
        </div>
        <div class="editor-field">
            @Html.EditorFor(model => model.TrenutniSemestar)
            @Html.ValidationMessageFor(model => model.TrenutniSemestar)
        </div>

        <div class="editor-label">
            @Html.LabelFor(model => model.StudijskiProgramID)
        </div>
        <div class="editor-field">
            @Html.DropDownListFor(model => model.StudijskiProgramID, ((IEnumerable<SSVN.Models.Studijski_Program>)ViewBag.StudProgrami).Select(option => new SelectListItem 
       {
        Text = (option == null ? "None" : option.Naziv), 
        Value = option.ID.ToString(),
        Selected = (Model != null) && (option.ID == Model.ID)
       }), "Izaberite")
            @Html.ValidationMessageFor(model => model.StudijskiProgramID)
        </div>

        <p>
            <input type="submit" value="Izmeni" />
        </p>
    </fieldset>
}

<div>
    @Html.ActionLink("Back to List", "Index")
</div>

Ответы [ 2 ]

1 голос
/ 22 мая 2011

Кажется, что Entities.Programs возвращает null, и внутри представления, когда вы пытаетесь вызвать для него метод расширения .Select, вы получаете это исключение.Или, может быть, вы помещаете это DropDownListFor в представление, которое было визуализировано из действия контроллера, которое ничего не помещает внутрь ViewBag.Programs.

Лично я бы использовал модели представления.

Такдавайте начнем с определения одного:

public class ProgramsViewModel
{
    public string ProgramID { get; set; }
    public IEnumerable<SelectListItem> Programs { get; set; }
}

, затем создадим действие контроллера, которое позаботится о заполнении этой модели вида:

public ActionResult Foo()
{
    var model = new ProgramsViewModel
    {
        Programs = Entities.Programs.Select(p => new SelectListItem
        {
            Value = p.ID,
            Text = p.Name
        })
    };
    return View(model);
}

и внутри вида:

@Html.DropDownListFor(
    model => model.ProgramID,     
    new SelectList(Model.Programs, "Value", "Text")
    "Choose..."
)

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

// Preselect the option with value="123"
model.ProgramID = "123";
0 голосов
/ 23 мая 2011

Мой ModelState был недопустим, поэтому контроллер вернул то же представление.Но так как в этом контроллере я не определил списки ViewBag, мое исключение NuD, вызванное DropDownList.

Мне просто нужно было передать эти списки через ViewBag.

ViewBag.Katedre = Entities.Katedras;
            ViewBag.Uloge = (System.Data.Objects.ObjectQuery<Uloga>)Entities.Ulogas.Where(x => (x.Naziv == "Profesor" || x.Naziv == "Asistent")).AsEnumerable();

            return View(predavac);

Это было проблемой.

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