MVC在视图中使用多个模型填充下拉列表

时间:2017-07-13 02:15:38

标签: c# asp.net-mvc

我正试图掌握MVC并尝试填充强类型下拉列表。我打算在索引页面上有很多下拉控件,并保持整洁,我想为每个下拉列表使用不同的模型,然后将所有这些与主索引模型一起使用。

构建应用程序时,我收到错误“ViewModels.HomeIndex.TrackModel.get返回null。”

enter image description here

当我设置断点时,我可以看到TrackModel不为空,但是TrackId和TrackName是。我想这就是造成这个问题的原因。

任何与MVC更加熟悉的人都会看到可能出现的问题。

enter image description here

在我的控制器中我有

public class HomeController : Controller
{      

    public ActionResult Index()
    {           
        TrackModel tm = new TrackModel();
        tm.Tracks = PopulateTracks();

        return View(new HomeIndex());
    }

    [HttpPost]
    public ActionResult Index(TrackModel tm)
    {
        tm.Tracks = PopulateTracks();
        var selectedItem = tm.Tracks.Find(p => p.Value == tm.TrackId.ToString());
        if (selectedItem != null)
        {
            selectedItem.Selected = true;
            ViewBag.Message = "Track: " + selectedItem.Text;
            ViewBag.Message += "\\TrackName: " + tm.TrackName;
        }

        return View(tm);
    }

    private static List<SelectListItem> PopulateTracks()
    {
        List<SelectListItem> items = new List<SelectListItem>();
        string constr = ConfigurationManager.ConnectionStrings["AiryDb"].ConnectionString;
        using (SqlConnection con = new SqlConnection(constr))
        {
            string query = "SELECT UserId, TrackName FROM UploadData";
            using (SqlCommand cmd = new SqlCommand(query))
            {
                cmd.Connection = con;
                con.Open();
                using (SqlDataReader sdr = cmd.ExecuteReader())
                {
                    while (sdr.Read())
                    {
                        items.Add(new SelectListItem
                        {
                            Text = sdr["TrackName"].ToString(),
                            Value = sdr["UserId"].ToString()
                        });
                    }
                }
                con.Close();
            }
        }

        return items;
      }
   }
}

HomeIndex Model我有

public class HomeIndex
{
    public TrackModel TrackModel { get; set; }       
}

我有TrackModel

public class TrackModel
{
    public List<SelectListItem> Tracks { get; set; }
    public int? TrackId { get; set; }
    public int? TrackName { get; set; }
}

我的剃刀观点

@using (Html.BeginForm("Index", "Home", FormMethod.Post))
{
    <table>
        <tr>
            <td>
                Tracks:
            </td>
            <td>
                @Html.DropDownListFor(m => m.TrackModel.TrackId, Model.TrackModel.Tracks, "Please select")
            </td>
        </tr>
        <tr>
            <td>
                Track Name:
            </td>
            <td>
                @Html.TextBoxFor(m => m.TrackModel.TrackName)
            </td>
        </tr>
        <tr>
            <td></td>
            <td>
                <input type="submit" value="Submit" />
            </td>
        </tr>
    </table>
}

2 个答案:

答案 0 :(得分:0)

您正在填充TrackModel,然后将新的HomeIndex模型传递到视图,而无需在控制器get方法中将TrackModel分配给HomeIndex模型。

您基本上是将一个空的HomeIndex模型传递给您的视图。

此外,最好重构代码,以便在没有任何参数的情况下调用它时,在HomeIndex构造函数中自动填充trackmodel。

答案 1 :(得分:0)

您可以使用以下代码轻松完成此操作:

Controller Get&amp;发布行动

像这样添加:

ViewBag.GivenName = UrDatabase.DatabaseName;

查看

您可以像这样使用:

@Html.DropDownListFor(m => m.TrackModel.TrackId ,
                                new SelectList(ViewBag.GivenName, "requiredValue(like ID or anything from the database)", "requiredView(To show in dropdown should be in database)"),
                                 "Please select", new { @class = "form-control" })