ASP.NET MVC - проблема с обработкой записей в выпадающем списке - PullRequest
3 голосов
/ 29 марта 2010

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

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using CMS;
using CMS.Model;
using System.ComponentModel.DataAnnotations;

namespace Portal.Models
{
    public class ArticleDisplay
    {
        public ArticleDisplay() { }


        public int CategoryID { set; get; }
        public string CategoryTitle { set; get; }

        public int ArticleID { set; get; }
        public string ArticleTitle { set; get; }
        public DateTime ArticleDate;
        public string ArticleContent { set; get; }

    }

    public class HomePageViewModel
    {
        public HomePageViewModel(IEnumerable<ArticleDisplay> summaries, Article article)
        {
            this.ArticleSummaries = summaries;
            this.NewArticle = article;
        }
        public IEnumerable<ArticleDisplay> ArticleSummaries { get; private set; }
        public Article NewArticle { get; private set; }
    }


    public class ArticleRepository
    {
        private DB db = new DB();

        //
        // Query Methods         

        public IQueryable<ArticleDisplay> FindAllArticles()
        {
            var result = from category in db.ArticleCategories
                         join article in db.Articles on category.CategoryID equals article.CategoryID
                         orderby article.Date descending
                         select new ArticleDisplay
                         {
                             CategoryID = category.CategoryID,
                             CategoryTitle = category.Title,

                             ArticleID = article.ArticleID,
                             ArticleTitle = article.Title,
                             ArticleDate = article.Date,
                             ArticleContent = article.Content
                         };

            return result;

        }

        public IQueryable<ArticleDisplay> FindTodayArticles()
        {
            var result = from category in db.ArticleCategories
                         join article in db.Articles on category.CategoryID equals article.CategoryID
                         where article.Date == DateTime.Today
                         select new ArticleDisplay
                         {
                             CategoryID = category.CategoryID,
                             CategoryTitle = category.Title,

                             ArticleID = article.ArticleID,
                             ArticleTitle = article.Title,
                             ArticleDate = article.Date,
                             ArticleContent = article.Content
                         };

            return result;
        }
        public Article GetArticle(int id)
        {
            return db.Articles.SingleOrDefault(d => d.ArticleID == id);
        }

        public IQueryable<ArticleDisplay> DetailsArticle(int id)
        {
            var result = from category in db.ArticleCategories
                         join article in db.Articles on category.CategoryID equals article.CategoryID
                         where id == article.ArticleID
                         select new ArticleDisplay
                         {
                             CategoryID = category.CategoryID,
                             CategoryTitle = category.Title,

                             ArticleID = article.ArticleID,
                             ArticleTitle = article.Title,
                             ArticleDate = article.Date,
                             ArticleContent = article.Content
                         };

            return result;
        }


        //
        // Insert/Delete Methods

        public void Add(Article article)
        {
            db.Articles.InsertOnSubmit(article);
        }

        public void Delete(Article article)
        {
            db.Articles.DeleteOnSubmit(article);
        }

        //
        // Persistence

        public void Save()
        {
            db.SubmitChanges();
        }
    }
}



using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using Portal.Models;
using CMS.Model;

namespace Portal.Areas.CMS.Controllers
{
    public class ArticleController : Controller
    {
        ArticleRepository articleRepository = new ArticleRepository();
        ArticleCategoryRepository articleCategoryRepository = new ArticleCategoryRepository();

        //
        // GET: /Article/

        public ActionResult Index()
        {
            ViewData["categories"] = new SelectList
            (
                articleCategoryRepository.FindAllCategories().ToList(), "CategoryId", "Title"
            );

            Article article = new Article()
            {
                Date = DateTime.Now,
                CategoryID = 1
            };

            HomePageViewModel homeData = new HomePageViewModel(articleRepository.FindAllArticles().ToList(), article);

            return View(homeData);            
        }

        //
        // GET: /Article/Details/5

        public ActionResult Details(int id)
        {
            var article = articleRepository.DetailsArticle(id).Single();

            if (article == null)
                return View("NotFound");

            return View(article);
        }

        //
        // GET: /Article/Create

        //public ActionResult Create()
        //{
        //    ViewData["categories"] = new SelectList
        //    (
        //        articleCategoryRepository.FindAllCategories().ToList(), "CategoryId", "Title"
        //    );

        //    Article article = new Article()
        //    {
        //        Date = DateTime.Now,
        //        CategoryID = 1
        //    };

        //    return View(article);
        //}

        //
        // POST: /Article/Create

        [ValidateInput(false)]
        [AcceptVerbs(HttpVerbs.Post)]
        public ActionResult Create(Article article)
        {
            if (ModelState.IsValid)
            {
                try
                {
                    // TODO: Add insert logic here

                    articleRepository.Add(article);
                    articleRepository.Save();

                    return RedirectToAction("Index");
                }
                catch
                {
                    return View(article);
                }
            }
            else
            {
                return View(article);
            }
        }

        //
        // GET: /Article/Edit/5

        public ActionResult Edit(int id)
        {
            ViewData["categories"] = new SelectList
            (
                articleCategoryRepository.FindAllCategories().ToList(), "CategoryId", "Title"
            );

            var article = articleRepository.GetArticle(id);

            return View(article);
        }

        //
        // POST: /Article/Edit/5

        [ValidateInput(false)]
        [AcceptVerbs(HttpVerbs.Post)]
        public ActionResult Edit(int id, FormCollection collection)
        {
            Article article = articleRepository.GetArticle(id);

            try
            {
                // TODO: Add update logic here
                UpdateModel(article, collection.ToValueProvider());
                articleRepository.Save();

                return RedirectToAction("Details", new { id = article.ArticleID });
            }
            catch
            {
                return View(article);
            }
        }

        //
        // HTTP GET: /Article/Delete/1
        public ActionResult Delete(int id)
        {
            Article article = articleRepository.GetArticle(id);

            if (article == null)
                return View("NotFound");

            else
                return View(article);
        }

        //
        // HTTP POST: /Article/Delete/1
        [AcceptVerbs(HttpVerbs.Post)]
        public ActionResult Delete(int id, string confirmButton)
        {
            Article article = articleRepository.GetArticle(id);

            if (article == null)
                return View("NotFound");

            articleRepository.Delete(article);
            articleRepository.Save();

            return View("Deleted");
        }

        [ValidateInput(false)]
        public ActionResult UpdateSettings(int id, string value, string field)
        {
            // This highly-specific example is from the original coder's blog system,
            // but you can substitute your own code here.  I assume you can pick out
            // which text field it is from the id.

            Article article = articleRepository.GetArticle(id);

            if (article == null)
                return Content("Error");

            if (field == "Title")
            {
                article.Title = value;
                UpdateModel(article, new[] { "Title" });
                articleRepository.Save();
            }
            if (field == "Content")
            {
                article.Content = value;
                UpdateModel(article, new[] { "Content" });
                articleRepository.Save();
            }
            if (field == "Date")
            {
                article.Date = Convert.ToDateTime(value);
                UpdateModel(article, new[] { "Date" });
                articleRepository.Save();
            }

            return Content(value);
        }


    }
}

и просмотр:

    <%@ Page Title="" Language="C#" MasterPageFile="~/Areas/CMS/Views/Shared/Site.Master" Inherits="System.Web.Mvc.ViewPage<Portal.Models.HomePageViewModel>" %>

<asp:Content ID="Content1" ContentPlaceHolderID="TitleContent" runat="server">
    Index
</asp:Content>

<asp:Content ID="Content2" ContentPlaceHolderID="MainContent" runat="server">

    <div class="naslov_poglavlja_main">Articles Administration</div>

    <%= Html.ValidationSummary("Create was unsuccessful. Please correct the errors and try again.") %>

    <% using (Html.BeginForm("Create","Article")) {%>

            <div class="news_forma">

                <label for="Title" class="news">Title:</label>
                <%= Html.TextBox("Title", "", new { @class = "news" })%>
                <%= Html.ValidationMessage("Title", "*") %>

                <label for="Content" class="news">Content:</label>
                <div class="textarea_okvir">

                    <%= Html.TextArea("Content", "", new { @class = "news" })%>
                    <%= Html.ValidationMessage("Content", "*")%>
                </div>

                <label for="CategoryID" class="news">Category:</label>
                <%= Html.DropDownList("CategoryId", (IEnumerable<SelectListItem>)ViewData["categories"], new { @class = "news" })%>

                <p>
                    <input type="submit" value="Publish" class="form_submit" />
                </p>


            </div>

    <% } %>


    <div class="naslov_poglavlja_main"><%= Html.ActionLink("Write new article...", "Create") %></div>

    <div id="articles">
        <% foreach (var item in Model.ArticleSummaries) { %>

            <div>       
                <div class="naslov_vijesti" id="<%= item.ArticleID %>"><%= Html.Encode(item.ArticleTitle) %></div>
                <div class="okvir_vijesti">

                    <div class="sadrzaj_vijesti" id="<%= item.ArticleID %>"><%= item.ArticleContent %></div>    
                    <div class="datum_vijesti" id="<%= item.ArticleID %>"><%= Html.Encode(String.Format("{0:g}", item.ArticleDate)) %></div>

                    <a class="news_delete" href="#" id="<%= item.ArticleID %>">Delete</a>

                </div>

                <div class="dno"></div>
            </div>

        <% } %>
    </div>

</asp:Content>

При попытке опубликовать новую статью я получаю следующую ошибку:

System.InvalidOperationException: Элемент ViewData с ключом CategoryId имеет тип System.Int32 но должно быть типа 'IEnumerable'.

Я действительно не знаю, что делать, потому что я довольно новичок в .net и mvc

Любая помощь приветствуется!
Ile




EDIT:

Я нашел, где я сделал ошибку. Я не включил дату. Если в форме просмотра я добавлю эту строку, я могу добавить статью:

<%=Html.Hidden("Date", String.Format("{0:g}", Model.NewArticle.Date)) %> 

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



РЕДАКТИРОВАТЬ 2: Ошибка при публикации!
Стек вызовов:
App_Web_of9beco9.dll! ASP.areas_cms_views_article_create_aspx .__ RenderContent2 (System.Web.UI.HtmlTextWriter __w = {System.Web.UI.HtmlTextWriter}, System.Web.UI.Control параметрConConW. Строка 31 + 0x9f байтов C #

Ответы [ 3 ]

3 голосов
/ 29 марта 2010

Решено! Проблема была здесь:

public ActionResult Create()
        {
            ViewData["categories"] = new SelectList
            (
                articleCategoryRepository.FindAllCategories().ToList(), "CategoryID", "Title"
            );

            Article article = new Article()
            {
                Date = DateTime.Now,
                CategoryID = 1
            };

            return View(article);
        }

Я установил CategoryID как целое число, и вот в чем проблема. Если я уберу эту строку, все будет работать нормально. Но тогда возникает вопрос, как установить категорию по умолчанию в раскрывающемся списке?

0 голосов
/ 23 марта 2011

У меня была такая же ошибка. В конце концов это был Combobox, который не был заселен.

Решением для меня было: я заполнил DropDownList в методе Create (тот, который отвечает на GET-запросы) и передал его в View с ViewData / ViewBag.

Метод Create (для POST-запроса) выдал исключение при вызове dataContext.SaveChanges (), и перехват содержал только это:

catch 
        {
            return View(companyRating);
        }

этого было недостаточно, View ожидал ViewData.Ratings SelectList, который больше не заполнялся. Поэтому я изменил его на

catch (Exception ex)
        {
            // Errormessage for now, of course should be made user-friendly
            ModelState.AddModelError("_FORM", ex.InnerException.Message);

            string[] list = new string[] { "1", "2", "3", "4", "5" };
            SelectList ratings = new SelectList(list);
            ViewBag.Ratings = ratings;

            return View(companyRating);
        }
0 голосов
/ 29 марта 2010

Посмотрим, исправит ли это:

<label for="CategoryID" class="news">Category:</label>
<%= Html.DropDownList("CategoryId", null, "-- Select Category --", new { @class = "news" })%>

Можете ли вы опубликовать, где именно выдается ошибка в представлении? Это может помочь нам разобраться в этом более четко.

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