Список POSTed DDL пуст при возврате к действию в контроллере - PullRequest
1 голос
/ 17 марта 2012

Я делаю вид с DropDown. Представление поставляется с CategoryModel, которая выглядит следующим образом:

public class CategoryModel
{
    [Required]
    [Display(Name = "Categories")]
    public List<Category> Categories { get; set; }

    [Required]
    [GreaterThan(ExceedValue = 0, ErrorMessage = "Please select a category.")]
    [Display(Name = "SelectedCategoryId")]
    public int SelectedCategoryId { get; set; }
}

Список категорий используется в представлении для заполнения DropDown, сначала взяв категории и поместив их в список SelectList, например:

@model RatingMVC3.Models.CategoryModel

@{
Layout = "~/Views/Shared/_MainLayout.cshtml";
ViewBag.Title = "Upload";
}

<h2>Upload</h2>

@using (Html.BeginForm("Upload", "Upload", FormMethod.Post, new { enctype = "multipart/form-data" }))
{
    <input type="file" name="file" />
    <input type="submit" value="OK" />
    @Html.DropDownListFor(m => m.SelectedCategoryId, new SelectList(Model.Categories, "Id", "Description"), "-- Select Category --");
    @Html.ValidationMessageFor(m => m.SelectedCategoryId);
    @Html.HiddenFor(m => m.Categories);
}

Когда эта форма отправляется и модель возвращается в контроллер, я вижу, что модель возвращается в контроллер, но содержит пустой список вместо списка категорий, который был в представлении. (SelectedCategoryId там, как и ожидалось). Вот метод ActionResult в контроллере:

    [HttpPost]
    [Authorize]
    public ActionResult Upload(HttpPostedFileBase file, CategoryModel model)
    {
        if (ModelState.IsValid)
        {
            if (file != null && file.ContentLength > 0)
            {
                var FileExtension = Path.GetExtension(file.FileName);
                string Path1 = null;
                string FileName = null;
                do
                {
                    var randomName = Path.GetRandomFileName();
                    FileName = Path.ChangeExtension(randomName, FileExtension);
                    Path1 = Path.Combine(Server.MapPath("~/Images"), FileName);
                } while (System.IO.File.Exists(Path1));
                file.SaveAs(Path1);
                if (UploadService.SaveImage(FileName, System.Web.HttpContext.Current.User.Identity.Name, model.SelectedCategoryId))
                {
                    return RedirectToAction("Uploaded", "Upload");
                }
            }
            return RedirectToAction("Index", "Home");
        }

        return View(model);
    }

Пустой список - проблема для меня, потому что, как вы можете видеть, если ModelState недопустим, представление снова будет возвращено с той же моделью и должно быть заполнено категориями. Я надеюсь, что кто-то может ответить на это;) Я с удовольствием укажу больше информации, если это необходимо, заранее спасибо

1 Ответ

0 голосов
/ 17 марта 2012

Во время операции POST весь список выбора (раскрывающийся) не возвращается в действие контроллера / формы, а только выбранное значение из этого списка. Если вам придется повторно визуализировать представление из-за плохой проверки, вы можете либо: a) сделать AJAX-отправку вместо полного POST по причинам проверки, либо b) заново создать свой список и отправить его обратно с представлением об ошибке. Вариант б) может быть реализован так:

[HttpPost]
    [Authorize]
    public ActionResult Upload(HttpPostedFileBase file, CategoryModel model)
    {
        if (ModelState.IsValid)
        {
            if (file != null && file.ContentLength > 0)
            {
                var FileExtension = Path.GetExtension(file.FileName);
                string Path1 = null;
                string FileName = null;
                do
                {
                    var randomName = Path.GetRandomFileName();
                    FileName = Path.ChangeExtension(randomName, FileExtension);
                    Path1 = Path.Combine(Server.MapPath("~/Images"), FileName);
                } while (System.IO.File.Exists(Path1));
                file.SaveAs(Path1);
                if (UploadService.SaveImage(FileName, System.Web.HttpContext.Current.User.Identity.Name, model.SelectedCategoryId))
                {
                    return RedirectToAction("Uploaded", "Upload");
                }
            }
            return RedirectToAction("Index", "Home");
        }
        //I don't know how you fetch this list, but just do it again before returning
        //the view
        model.Categories = GetMyCategories();
        return View(model);
    }

Полагаю, если вы захотите, вы можете сохранить список элементов в виде скрытого ввода на вашей странице, но это выглядит просто уродливо, увеличивает объем данных, отправляемых на веб-страницу и с нее, и черт побери, просто звучит чертовски похоже на ViewState (shrudders).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...