У меня очень простой выпадающий список, который должен возвращать внешний ключ, чтобы я мог связать загруженные файлы с категорией.
Я использую 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; }
}