#c# #asp.net-mvc-3 #html.dropdownlistfor
#c# #asp.net-mvc-3 #html.выпадающий список для
Вопрос:
Я исследовал эту проблему, но не смог собрать воедино ответ, который работает в моей ситуации. Я ценю любую помощь.
Я пытаюсь создать выпадающий список, который будет отображать имена приложений на странице создания задачи, но отправляет идентификатор приложения обратно в базу данных. В настоящее время я могу корректно отображать имена приложений в выпадающем списке, когда я использую DropDownList. Однако обратная отправка не работает, и я хотел бы использовать DropDownListFor вместо этого. Кроме того, я использую Dictionary(int, String>, но я бы предпочел использовать IEnumerable. Я ходил кругами, пытаясь заставить DropDownListFor работать, но пока безуспешно. Кто-нибудь знает, какие изменения мне нужно внести?
Модель ‘Task’:
using System;
using System.Collections.Generic;
using System.Web.Mvc;
namespace TaskCapture.Models
{
public class Task
{
public int TaskID { get; set; }
public string TaskDescription { get; set; }
public int ApplicationID { get; set; }
public virtual Application Application { get; set; }
}
}
Модель «Приложения»:
using System;
using System.Collections.Generic;
namespace TaskCapture.Models
{
public class Application
{
public int ApplicationID { get; set; }
public string ApplicationName { get; set; }
public override string ToString()
{
return ApplicationName;
}
}
}
TaskController:
using System;
using System.Collections.Generic;
using System.Data;
using System.Data.Entity;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using TaskCapture.Models;
using TaskCapture.DAL;
namespace TaskCapture.Controllers
{
public class TaskController : Controller
{
private SupportContext db = new SupportContext();
//
// GET: /Task/Create
// get application names for listing in drop down
public Dictionary<int, String> GetApplications()
{
Dictionary<int, String> _applications = new Dictionary<int, String>();
var applicationsQuery =
from o in db.Applications
orderby o.ApplicationName
select o;
foreach (var c in applicationsQuery)
{
_applications.Add(c.ApplicationID, c.ApplicationName);
}
return _applications;
}
public ActionResult Create()
{
Dictionary<int, String> Applications = this.GetApplications();
ViewData["ApplicationList"] = new SelectList(Applications, "Key", "Value");
return View();
}
//
// POST: /Task/Create
[HttpPost]
public ActionResult Create(Task task)
{
try
{
if (ModelState.IsValid)
{
db.Tasks.Add(task);
db.SaveChanges();
return RedirectToAction("Index");
}
}
catch (DataException)
{
//Log the error (add a variable name after DataException)
ModelState.AddModelError("", "Unable to save changes. Try again....");
}
return View(task);
}
}
}
Задача Create.cshmtl:
@model TaskCapture.Models.Task
@{
ViewBag.Title = "Create";
}
<h2>Create</h2>
<script src="@Url.Content("~/Scripts/jquery.validate.min.js")" type="text/javascript"></script>
<script src="@Url.Content("~/Scripts/jquery.validate.unobtrusive.min.js")" type="text/javascript"></script>
@using (Html.BeginForm()) {
@Html.ValidationSummary(true)
<fieldset>
<legend>Task</legend>
<div class="editor-label">
@Html.LabelFor(model => model.Application.ApplicationName)
</div>
<div class="editor-field">
@Html.DropDownList("ApplicationList", (SelectList) ViewData["ApplicationList"])
@Html.ValidationMessageFor(model => model.Application.ApplicationName)
</div>
<p>
<input type="submit" value="Create" />
</p>
</fieldset>
}
<div>
@Html.ActionLink("Back to List", "Index")
</div>
Любая помощь приветствуется. Пожалуйста, дайте мне знать, если мне нужно опубликовать больше информации. Спасибо.
Комментарии:
1. Обновление: Я переместил GetApplications () в модель приложения и превратил ее в IEnumerable. Мой выпадающий список для теперь выглядит следующим образом: @Html.Выпадающий список для (m => m.applicationId, модель. Приложение. GetApplications()). Приложение собирается нормально, но во время выполнения я получаю сообщение об ошибке «Ссылка на объект не установлена для экземпляра объекта» из выпадающего списка для строки.
2. РЕШЕНИЕ: Наконец-то у меня получилось. Мне нужно было создать новый объект приложения: @Html.Выпадающий список для (модель => model. Идентификатор приложения, новый TaskCapture. Модели. Application(). GetApplications())
3. Можете ли вы указать это в качестве ответа .. я хотел бы поддержать это
Ответ №1:
Наконец-то у меня это заработало. Мне нужно было создать новый объект приложения:
@Html.DropDownListFor(model => model.ApplicationID, new TaskCapture.Models.Application().GetApplications())