Проблема с ASP.NET Выпадающий список MVC 3 для

#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())