如何使用ASP MVC SQL和EF在同一视图中从不同模型创建两个DropDownList

时间:2013-05-10 10:12:11

标签: c# asp.net-mvc-3 visual-studio-2010 sql-server-2005

我正在使用C#和SQL Server 2005开发ASP.Net MVC 3应用程序。我正在使用实体框架和代码优先方法。

我有一个模型Profile_Ga及其视图(索引,创建,...)。

我在此模型的索引中创建了一个DropDownList来加载ID(ID_Gamme)。

我现在想在Profil_Ga的索引中加载另一个表(Poste的另一个模型)的ID。

但是总会出现这个错误:

  

DataBinding:'MvcApplication2.Models.Profile_Ga'不包含   名为“ID_Poste”的属性。

这是Profile_Ga的控制器:

namespace MvcApplication2.Controllers
{ 
    public class ProfileGaController : Controller
    {
        private GammeContext db = new GammeContext();

        //
        // GET: /ProfileGa/

        public ViewResult Index(Profile_Ga profile_ga, Poste poste)
        {
            ViewBag.ID_Gamme = new SelectList(db.Profil_Gas, "ID_Gamme", profile_ga.ID_Gamme);
            ViewBag.ID_Poste = new SelectList(db.Postes, "ID_Poste", poste.ID_Poste);
            return View(db.Profil_Gas.ToList());


        }

这就是我在索引中添加的内容:

<%:Html.Label("Gamme :")%>
       <%: Html.DropDownList("ID_Gamme", new SelectList(Model, "ID_Gamme", "ID_Gamme ")) %>


        <%:Html.Label("Poste :")%>
       <%: Html.DropDownList("ID_Poste", new SelectList(Model, "ID_Poste", "ID_Poste ")) %>

2 个答案:

答案 0 :(得分:2)

错误发生了。模型不包含ID_Poste

您正在将db.Postes存储到ViewBag中,但传递给视图的模型只是db.Profil_Gas,如此部分所示:return View(db.Profil_Gas.ToList()); - 这不会包含db.Postes

如果您想展示两个单独的内容,最好的方法是创建一个包含这样的内容的新 ViewModel 类。

查看模型

public class MyViewModel
{
    // The two drop-down lists
    public List<Profile_Ga> Profile_Gas { get; set; }
    public List<Poste> Postes { get; set; }

    // Used to store selected items
    public int SelectedProfile_Ga { get; set; }
    public int SelectedPoste { get; set; }
}

然后在您的控制器中

[HttpGet]
public ActionResult Index(Profile_Ga profile_ga, Poste poste)
{
    var viewModel = new MyViewModel();
    viewModel.Profile_Gas = db.Profil_Gas.ToList();
    viewModel.Postes = db.Postes.ToList();
    return View(viewModel);
}

[HttpPost]
public ActionResult Index(MyViewModel viewModel)
{
    string debug = string.Format("You selected Profile: {0} and Poste: {1}", viewModel.SelectedProfile_Ga, viewModel.SelectedPoste);
    return View(viewModel);
}

最后在您的视图中

<%: Html.DropDownList("SelectedProfile_Ga", new SelectList(Model.Profile_Gas, "ID_Gamme", "NameToShow")) %>
<%: Html.DropDownList("SelectedPoste", new SelectList(Model.Postes, "ID_Poste", "NameToShow")) %>

然后,您只需将NameToShow替换为您要在下拉框中显示的属性即可。然后,当您提交表单时, ViewModel 将与下拉框的值一起传回(如代码示例所示)。在HttpPost项目的调试中放置断点以检查值是否正确然后你应该好好去!

答案 1 :(得分:1)

您的视图模型为Profile_Gas,因此您无法执行

<%:Html.Label("Poste :")%>
       <%: Html.DropDownList("ID_Poste", new SelectList(Model, "ID_Poste", "ID_Poste ")) %>

您需要创建一个封装Profile_GaPoste

的视图模型
public class ViewModel
{
    public List<Poste> Postes { get; set; }
    public List<Profile_Ga> Profile_Gas { get; set; }
}

并从控制器返回此视图模型。

public ViewResult Index(Profile_Ga profile_ga, Poste poste)
{
    return new ViewModel
            {
                 Postes = db.Postes.ToList(),
                 Profile_Gas = db.Profil_Gas.ToList();
            }
}

所以你的观点看起来像

<%:Html.Label("Gamme :")%>
       <%: Html.DropDownList("ID_Gamme", new SelectList(Model.Profile_Gas, "ID_Gamme", "ID_Gamme ")) %>


        <%:Html.Label("Poste :")%>
       <%: Html.DropDownList("ID_Poste", new SelectList(Model.Postes, "ID_Poste", "ID_Poste ")) %>