C#MVC4在Textarea中保存HTML - 验证失败

时间:2013-11-25 10:28:45

标签: c# asp.net-mvc asp.net-mvc-4

我有一个页面创建表单,使用Page class

类别:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.ComponentModel.DataAnnotations;
using System.Web.Mvc;
using System.Globalization;
using SpringHealthOne.SpringWS;
using System.Configuration;
using System.ComponentModel.DataAnnotations.Schema;

namespace SpringHealthOne.Models
{
    public class Page 
    {
        public int PageID { get; set; }
        [Required]
        public string Title { get; set; }

        [NotMapped]
        public MvcHtmlString PageBody { get; set; }

        public string Body
        {
            get { return PageBody.ToHtmlString(); }
            set { PageBody = new MvcHtmlString(value); }
        }

        public string MetaTitle { get; set; }
        public string MetaDescription { get; set; }
        public string Keywords { get; set; }
        public bool Published { get; set; }
    }
}

表单本身很简单,它包含一个添加了Ckeditor的textarea。当我最初尝试保存字段时,我得到了不安全的输入错误(HTML),所以我在方法中添加了[ValidateInput(false)]

[ValidateInput(false)]
[HttpPost]
public ActionResult Edit(Page page)
    {
        if (ModelState.IsValid)
        {
            db.Entry(page).State = EntityState.Modified;
            db.SaveChanges();
            return RedirectToAction("Index");
        }
        return View(page);
    }

我不再获得异常,但ModelState.IsValid始终设置为false,我得到以下错误:

The value '<HTML STRING>' is invalid.

有人能指出我正确的方向吗?我是C#的新手,更多是MVC4

1 个答案:

答案 0 :(得分:1)

我认为AllowHtmlAttribute正是您所寻找的。您可以像这样使用它:

[AllowHtml]
public string Body { get; set; }

这允许您在字符串中使用HTML标记,因为它会跳过此属性的模型验证。您不应该需要ValidateInput属性。我认为无论如何都不要使用它,因为它会跳过整个模型的验证,这可能会导致ModelState.IsValid属性为false,因为您跳过了验证。另请参阅this article