我有一个下拉框,由数据库中的enteries填充。但是DropDownList中的第一个值不起作用。请帮帮我
@model IEnumerable<MvcApplication.Models.Bookinfo>
@{
ViewBag.Title = "NewRequest";
}
<h2>NewRequest</h2>
@using (@Html.BeginForm("Reserve","Book" ))
{
<table>
<tr>
<td>
@Html.DropDownList("Bookname",Model.Select(m => new SelectListItem()
{Text = m.Bookname, Value = m.Bookname }).ToList())
</td>
</tr>
<tr>
<td>
<input type = submit value="Reserve">
</td>
</tr>
</table>
}
Actualy它给出了空值。我可以这样做,把一些随机文本作为列表的第一个元素,如&#34;选择一本书&#34;并从第二个元素
开始列表现在我面临另一个问题。它无法保留任何新创建的书籍。我似乎无法弄清楚问题
public ActionResult Reserve(string bookname,Issued issue)
{
try
{
using (var db = new Database1Entities1())
{
var bookID= (from some in db.Bookinfoes where some.Bookname==bookname select some.Id).First();
// var issueddate = (from issuedate in db.Issueds where issuedate.BookId == bookID select issuedate.date).First();
if (db.Issueds.Where(i=>i.BookId == bookID).FirstOrDefault().BookId != 0 )
{
return RedirectToAction("AlreadyReserved");
}
var date = DateTime.Now.Date;
issue.BookId = bookID;
issue.date = date;
db.Issueds.Add(issue);
db.SaveChanges();
}
}
catch
{
return RedirectToAction("Index");
}
return View();
}
始终捕获异常并返回索引页
答案 0 :(得分:1)
您应该将BookId作为值,如下所示: -
@Html.DropDownList("Bookname",Model.Select(m => new SelectListItem()
{Text = m.Bookname, Value = m.BookId}).ToList())
答案 1 :(得分:0)
您可以将第一个Selected
的{{1}}个属性设置为true。由于您已经使用LINQ-Expression来构建列表,因此您可以使用类似的东西(传递给SelectListItem
的lambda表达式中的第二个参数接收元素的索引...):< / p>
Select
修改:如果您想将一些任意文字作为第一项(例如&#34;选择一本书&#34;),您可以通过添加额外{{1}来实现这一目标在你的书前。这可以使用一些&#34; LINQ魔法&#34;像:
@Html.DropDownList("Bookname", Model.Select((m,i) => new SelectListItem
{Text = m.Bookname, Value=m.Bookname, Selected = i==0}).ToList())
注意:SelectListItem
用于创建仅包含一个元素的序列。同样在这种情况下,您可以将第一个元素的@Html.DropDownList("Bookname",
Enumerable.Repeat(new SelectListItem {Text = "Select a book", Value=null, Selected=True}, 1)
.Concat(Model.Select((m,i) => new SelectListItem
{Text = m.Bookname, Value=m.Bookname}))
.ToList())
属性设置为Enumerable.Repeat
,并将其Selected
保留在列表的其余部分。