我正试图掌握MVC并尝试填充强类型下拉列表。我打算在索引页面上有很多下拉控件,并保持整洁,我想为每个下拉列表使用不同的模型,然后将所有这些与主索引模型一起使用。
构建应用程序时,我收到错误“ViewModels.HomeIndex.TrackModel.get返回null。”
当我设置断点时,我可以看到TrackModel不为空,但是TrackId和TrackName是。我想这就是造成这个问题的原因。
任何与MVC更加熟悉的人都会看到可能出现的问题。
在我的控制器中我有
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>
}
答案 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" })