Я пытаюсь понять что-то немного лучше, будучи новым для C#, .NET 3.5 и MVC.Ошибка при попытке заполнить выпадающий список во время действия «GET» create
Я бегу через пример MVC NerdDinner, и если вы посмотрите на ViewModel здесь: http://nerddinnerbook.s3.amazonaws.com/Part6.htm#highlighter_662935
Вы можете увидеть список стран и как он получает, это, кажется, работает хорошо, но я пытался сделать подобное ниже, используя LINQ, и у меня возникают проблемы с использованием подхода SelectList, хотя он наследуется от интерфейса IEnumerable.
У меня есть таблица задач с внешним ключом в таблице состояния. Приведенный ниже код дает мне исключение NullReferenceException, когда я делаю GET при создании действия. Я вижу, что анонимный объект задачи не имеет статуса. Поэтому мне, вероятно, нужно проверить его, но я не понимаю, как это не делается для примера 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
Вы могли решить tht проблему? если да, то как? –