Проблемный DropdownListFor выдает разные ошибки для разных реализаций - PullRequest
0 голосов
/ 28 апреля 2018

У меня очень простой выпадающий список, который должен возвращать внешний ключ, чтобы я мог связать загруженные файлы с категорией.

Я использую MVC-5 с Entity Framework. Все запросы на самом деле находятся в репозитории, так что не расстраивайтесь.

Примечание: Категории можно увидеть в раскрывающемся списке. Это когда я пытаюсь отправить данные обратно, я получаю пару ошибок.

Сначала я покажу вам два способа, которыми я пытался реализовать Dropdownlist, затем я покажу вам мою модель, представление и код контроллера

Первый путь

Я использовал Viewbag для создания SelectList, который я затем использую для выпадающего меню следующим образом:

Контроллер:

public class HomeController : Controller
{
    private db Context;

    public HomeController() { db = new Context(); }

    [HttpGet]    
    public ActionResult HelloWorld() 
    {
        var query = db.Table.Where(u => u.Random == "helloworld").ToList();

        ViewBag.DropDown = new SelectList (query, "RandomID", "Random");

        return View();
    }

    [HttpPost]
    public ActionResult HelloWorld(IEnumerable<HttpPostedFileBase> file, Table table) 
    {
        //Do Stuff
    }
}

Вид:

@using(Html.BeginForm())
{
    @Html.AntiForgeryToken()

    <input type="file" value="Select Images" multiple />

    @Html.Label("Categories") 
    @Html.DropdownList("DropDown", null, "Select")

    <input type="submit" value="Upload">
}

Получено сообщение об ошибке: Нет элемента ViewData типа 'IEnumerable', который имеет ключ 'RandomID'. ' ( В выпадающем списке )

Запрос выбрал в * 1034 все, что имело Random = "helloworld", и превратил его в список, поэтому по необходимости RandomID должен быть там

Второй путь

Я использовал модель для привязки и отправки SelectList вниз и пытался использовать модель в действии Post

Контроллер:

public class HomeController: Controller
{
    private db Context;

    HomeController() { db = new Context(); }

    [HttpGet]
    public ActionResult HelloWorld(Model model)
    {
        dropdown = db.Table.ToList();

        model.List = new SelectList(dropdown, "RandomID", "Random")

        return View(model)
    }

    [HttPost]
    public ActionResult HelloWorld(IEnumerable<HttpPostedFileBase> file, Model model)
    {
        //Do Stuff
    }
}

Вид:

Вид точно такой же, как указано выше, за исключением

@Html.DropDownListFor(u => u.RandomID, (SelectList)Model.List, "Select")

и, конечно,

@model Project.Models.Model

Модель:

public class Model
{
    public IEnumerable<SelectListItem> List { get; set; }
    public int RandomID { get; set; }
}

Получено сообщение об ошибке: System.NullReferenceException: ссылка на объект не установлена ​​для экземпляра объекта. ( В выпадающем списке для )

Так ясно, что удостоверение личности пусто и возвращается null, но я не могу понять почему.

Мой код

Контроллер:

public ActionResult EditPhotos(AddImageModel model)
{
    if (Session["id"] == null)
    {
        return RedirectToAction("Index");
    }
    else
    {
        var pics = query.GalleryCategories();
        model.List = new SelectList(pics, "CategoryName", "CategoryName");

        return View(model);
    }
}

[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult EditPhotos(IEnumerable<HttpPostedFileBase> files, AddImageModel model)
{
    string[] Extensions = new string[] { ".jpg", ".Jpg", ".jpeg", ".png" };

    try
    {
        if (files != null)
        {
            foreach (HttpPostedFileBase file in files)
            {
                var name = Path.GetFileName(file.FileName);
                var ID = model.ID;
                var ext = Path.GetExtension(file.FileName);

                if (Extensions.Contains(ext))
                {
                    var filepath = Path.Combine(Server.MapPath("~/Images/Gallery"), name);

                    query.AddPictures(filepath, ID);

                    file.SaveAs(filepath);

                    return View();
                }
                else
                {
                    ViewBag.Message = "Accepted file types are: '.jpg' '.Jpg' '.jpeg' and '.png'";
                }
            }
        }
    }
    catch (Exception) { return View("Error"); }

    return View();
}

Вид:

@model DKWebPage.Models.AddImageModel
<div id="modal">
    <div class="form-menu">
        @using (Html.BeginForm("EditPhotos", "Admin", FormMethod.Post, new { @class = "form" }))
        {
            @Html.AntiForgeryToken();

            <input value="Upload Images" type="file" multiple />
            @ViewBag.Message
            @Html.Label("Categories", new { @class = "dd-menu-label" })
            @Html.DropDownListFor(u => u.ID, (SelectList)Model.List, "Select Category", new { @class = "dd-menu" })

            <input type="submit" value="Upload Images" class="smallbutton" style="align-self: flex-end"/>
        }
    </div>
</div>

Модель

public class AddImageModel
    {
        public IEnumerable<SelectListItem> List { get; set; }
        public int ID { get; set; }
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...