【问题标题】:ASP.NET MVC , proper way to persist dynamic selectList?ASP.NET MVC,保持动态选择列表的正确方法?
【发布时间】:2013-03-28 10:01:05
【问题描述】:

我正在学习 MVC4+EF 5.0 项目,我使用 VS2012 默认模板创建空白项目并将数据库脚手架到 *.edmx 模型,以及用于编辑 staff 工作的编辑视图在哪家公司。

当用户输入失败并返回时,我遇到的问题是在编辑视图(下拉)中维护 SelectList。

DropDownList 从控制器绑定 ListItem:

Edit.cshtml

@Html.DropDownListFor(model => model.CompanyID, (SelectList)ViewData["CompanySelectList"])

MemberController.cs

[HttpGet]
public ActionResult Edit(int SelectedCompanyID = 0, int StaffID = 0)
{
    IQueryable<company_benefit> companys = from c in db.company where c.ID.Equals(CompanyID) select c ;
    ViewData["CompanySelectList"] = new SelectList(companys, "ID", "Name", SelectedCompanyID);

    staff s = db.staff.Find(StaffID);
    if (s == null)
    {
        return HttpNotFound();
    }
    return View(s);
}


    [HttpPost]
    public ActionResult Edit(staff s)
    {
        if (ModelState.IsValid)
        {
            db.Entry(s).State = EntityState.Modified;
            db.SaveChanges();
            return RedirectToAction("Index"); //Edit Success
        }

        return View(s); //Edit Fail
    }

如果有人提交了无效数据导致输入失败的表单,它将返回视图。 但是,SelectList 是从 ViewData 绑定的,所以加载页面时 ViewData 会消失,这是 viewdata 的行为,我更改为 TempData 也无济于事。

那么当 Post to Edit Action 时我需要再次构建 SelectList 吗?

我关心使用 session 来存储它,但害怕打破 MVC 设计模式。

我的英语不好,很抱歉造成混乱。 谢谢。

【问题讨论】:

    标签: asp.net-mvc-4


    【解决方案1】:

    一个快速的解决方案是在您的 http post 方法中再次编辑创建您的视图数据

    [HttpPost]
    public ActionResult Edit(staff s)
    {
        if (ModelState.IsValid)
        {
            db.Entry(s).State = EntityState.Modified;
            db.SaveChanges();
            return RedirectToAction("Index"); //Edit Success
        }
        IQueryable<company_benefit> companys = from c in db.company where c.ID.Equals(CompanyID) select c ;
        ViewData["CompanySelectList"] = new SelectList(companys, "ID", "Name", SelectedCompanyID);
    
    
        return View(s); //Edit Fail
    }
    

    您所做的基本上是说,当您从编辑视图返回到服务器时,服务器应该重建视图数据并调用相同的视图,以便它可以填充列表。

    有一种更好的方法可以创建一个模型,该模型同时包含当前模型和list&lt;companys&gt; companies = new list&lt;companys&gt;();,然后从数据库中再次填充它。再次,这个概念是相同的,只是使用强类型模型。

    【讨论】:

    • 感谢您的回答,但它是否破坏了 ASP.NET MVC 机制或概念?
    • 因为从数据库再次填充它似乎重复了这个任务。
    • 您可以在视图模型的构造函数中定义列表的填充,并且不要在实际编辑或后期编辑视图中重复它。
    猜你喜欢
    • 2023-02-17
    • 2011-11-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-14
    • 1970-01-01
    相关资源
    最近更新 更多