我试图更好地理解 C#、.NET 3.5 和 MVC 的新手。
我正在运行 MVC NerdDinner 示例,如果您在此处查看 ViewModel:http: //nerddinnerbook.s3.amazonaws.com/Part6.htm#highlighter_662935
您可以看到 Country 列表及其填充方式,这似乎工作正常,但我尝试在下面使用 LINQ 执行类似的操作,但使用 SelectList 方法时遇到了问题,即使它继承自 IEnumerable 接口。
我有一个带有状态表外键的任务表。当我对创建操作执行 GET 时,下面的代码给了我一个 NullReferenceException。我可以看到匿名任务对象不会设置状态..所以我可能需要检查它,但我不明白对于 NerdDinner 示例如何不这样做?
public class TaskViewModel {
// Properties
public Task Task { get; private set; }
public SelectList Status { get; private set; }
// Constructor
public TaskViewModel(Task task) {
TaskRepository taskRepo = new TaskRepository();
Task = task;
Status = new SelectList(taskRepo.GetStatus(), Task.Status.description);
}
}
//
// GET: /Tasks/Create
public ActionResult Create()
{
Task task = new Task();
return View(new TaskViewModel(task));
}
//Code from TaskRepository
private TaskManagerDataContext db = new TaskManagerDataContext();
public IQueryable<Status> GetStatus() {
return from status in db.Status
orderby status.description
select status;
}
我使用 LINQ 对类型下拉列表进行了另一种方法,并且下拉列表的数量有效,但我尚未测试它是否在发布帖子并返回详细信息视图后选择了正确的值。我也想知道这是否应该如何移动到我的存储库中,而不是在我的控制器中让一个类做这种事情?
这是代码:
//In TaskViewModel Class
public IEnumerable<SelectListItem> Types { get; private set; }
//In TaskViewModel constructor
IList<NPType> types = taskRepo.GetTypes().ToList();
Types =
from type in types
select new SelectListItem {
Selected = (type.typeId == task.typeId),
Text = type.description,
Value = type.typeId.ToString()
};
//The TaskForm partial View that is used for the Create action of the TaskController
<p>
<label for="type">type:</label>
<%= Html.DropDownList("Type", Model.Types)%>
<%= Html.ValidationMessage("type", "*") %>
</p>
<p>
<label for="status">status:</label>
<%= Html.DropDownList("Status", Model.Status)%>
<%= Html.ValidationMessage("status", "*") %>
</p>
并且 TaskForm 视图继承 System.Web.Mvc.ViewUserControl