我正在开发一个简单的项目跟踪网站。 “项目”具有“任务”,“任务”具有“子任务”。 使用默认的脚手架,在创建“任务”时,我必须手动选择“任务”的“ProjectId”字段。 我想设置它,我只能在“项目详细信息”视图中创建“任务”。 我想知道如何制作它所以我不必在创建新任务时手动选择“ProjectId”。 以下是片段:
这是Visual Studio自动生成的Task的Create.cshtml的一部分:
<div class="editor-label">
@Html.LabelFor(model => model.ProjectId, "Project Id")
</div>
<div class="editor-field">
@Html.DropDownList("ProjectId", String.Empty)
@Html.ValidationMessageFor(model => model.ProjectId)
</div>
这会产生一个下拉框,我必须手动选择项目ID。
这是“任务”控制器默认的“创建”操作:
public ActionResult Create()
{
ViewBag.ProjectId = new SelectList(db.Projects, "Id", "Id");
ViewBag.StatusId = new SelectList(db.Status, "Id", "Name");
ViewBag.TaskTypeId = new SelectList(db.TaskTypes, "Id", "Name");
return View();
}
我想要的是这样的:
public ActionResult Create()
{
ViewBag.ProjectId = RouteData.Values["Id"];
ViewBag.StatusId = new SelectList(db.Status, "Id", "Name");
ViewBag.TaskTypeId = new SelectList(db.TaskTypes, "Id", "Name");
return View();
}
某处我必须设置myTask.ProjectId = ViewBag.ProjectId。但我不知道在哪里。 这甚至是正确的做法吗?或者有更好的方法吗?
由于
答案 0 :(得分:1)
设置ProjectId
的默认值并不像您想象的那么困难,SelectList
的重载需要object selectedValue
。
替换它:
ViewBag.ProjectId = new SelectList(db.Projects, "Id", "Name");
有了这个(我在这种情况下使用2作为选定的Id):
ViewBag.ProjectId = new SelectList(db.Projects, "Id", "Name", 2);
答案 1 :(得分:1)
您确定需要DropDownList
而不仅仅是具有固定值的隐藏输入吗?
听起来你想要设置值,甚至不能看到它的可视化表示。如果是这种情况,您只需在模型中传递您的ID,然后将其绑定到隐藏的输入。
答案 2 :(得分:0)
我想到了两种可能性。
控制器:
public ActionResult Create()
{
var task = new Task() { ProjectId = your_predefined_value };
ViewBag.Projects = new SelectList(db.Projects, "Id", "Id");
ViewData.Model = task;
return View();
}
查看:
@Html.DropDownListFor(x => x.ProjectId, (SelectList)ViewBag.Projects)
DropDownListFor将从其标识符与x.ProjectId
匹配的ViewBag.Projects中预选项目另一种方法是在特定项目上将SelectListItem的Selected
属性设置为true。
控制器:
public ActionResult Create()
{
ViewBag.Projects = new List<SelectListItem>() {
new SelectListItem()
{
Value = "1",
Text = "Project 1",
Selected = true
}
};
//...
}
查看:
@Html.DropDownList("ProjectId", (IEnumerable<SelectListItem>)ViewBag.Projects)