MVC ViewBag下拉值参数传递

时间:2011-05-22 12:31:17

标签: asp.net-mvc asp.net-mvc-3 razor

在数据库中我有表用户和学生。我使用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:值不能为null。 参数名称:source

@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);
        }

查看

@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 个答案:

答案 0 :(得分:1)

当您尝试在其上调用.Select扩展方法时,Entities.Programs似乎返回null并在视图内部获得此异常。或者你可能将这个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";

答案 1 :(得分:0)

我的ModelState无效,因此控制器返回了相同的视图。 但是因为在这个控制器中我没有定义ViewBag列出我的DropDownList引发的Null异常。

我只需要通过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);

这是问题。