ASP.NET MVC validation problem

Posted by ile on Stack Overflow See other posts from Stack Overflow or by ile
Published on 2010-03-24T19:41:53Z Indexed on 2010/03/24 19:43 UTC
Read the original article Hit count: 767

Filed under:
|
|
|

ArticleRepostitory.cs:

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

namespace CMS.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 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
                           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();
        }
    }
}

ArticleController.cs:

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

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

        //
        // GET: /Article/

        public ActionResult Index()
        {
            var allArticles = articleRepository.FindAllArticles().ToList();
            return View(allArticles);
        }

        //
        // 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

        [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

        [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");
        }



    }
}

View/Article/Create.aspx:

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

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

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

    <h2>Create</h2>

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

    <% using (Html.BeginForm()) {%>

        <fieldset>
            <legend>Fields</legend>

            <p>
                <label for="Title">Title:</label>
                <%= Html.TextBox("Title") %>
                <%= Html.ValidationMessage("Title", "*") %>
            </p>
            <p>
                <label for="Content">Content:</label>
                <%= Html.TextArea("Content", new { id = "Content" })%>
                <%= Html.ValidationMessage("Content", "*")%>
            </p>
            <p>
                <label for="Date">Date:</label>
                <%= Html.TextBox("Date") %>
                <%= Html.ValidationMessage("Date", "*") %>
            </p>
            <p>
                <label for="CategoryID">Category:</label>
                <%= Html.DropDownList("CategoryId", (IEnumerable<SelectListItem>)ViewData["categories"])%>
            </p>
            <p>
                <input type="submit" value="Create" />
            </p>
        </fieldset>

    <% } %>

    <div>
        <%=Html.ActionLink("Back to List", "Index") %>
    </div>

</asp:Content>

If I remove DropDownList from .aspx file then validation (on date only because no other validation exists) works, but of course I can't create new article because one value is missing.
If I leave dropdownlist and try to insert wrong date I get following error:

System.InvalidOperationException: The ViewData item with the key 'CategoryId' is of type 'System.Int32' but needs to be of type 'IEnumerable'.

If I enter correct date than the article is properly inserted. There's one other thing that's confusing me... For example, if I try manually add the categoyID:

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

                    // Manually add category value
                    article.CategoryID = 1;

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

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

..I also get the above error.
There's one other thing I noticed. If I add partial class Article, when returning to articleRepository.cs I get error that 'Article' is an ambiguous reference between 'CMS.Models.Article' and 'CMS.Model.Article'

Any thoughts on this one?

© Stack Overflow or respective owner

Related posts about ASP.NET

Related posts about mvc