"必需" " AllowHtml"属性不起作用属性被使用。 MVC 5

时间:2015-12-10 14:40:01

标签: asp.net-mvc validation asp.net-mvc-5

我想用wysiwyg编辑器发布一个html,所以我在我的属性上使用了[AllowHtml]属性。它可以工作,但当我使用[Required][StringLength]属性时,它会停止工作。即使道具是空的,ModelState.IsValid也会返回true。

是的,我知道如果它为空,我可以手动控制它并向ModelState添加错误,但为什么?

为什么会这样?有没有更好的方法将一些HTML代码发布到后端?

我的dto:

public int Id { get; set; }

[Required(ErrorMessage = CErr.RequiredField)]
[StringLength(100, ErrorMessage = CErr.Min5Max100)]
[MinLength(5, ErrorMessage = CErr.Min5Max100)]
public string Name { get; set; }

[AllowHtml]
[Required(ErrorMessage = CErr.RequiredField)]
[StringLength(4000, ErrorMessage = CErr.TooLongValue)]
public string HtmlBody { get; set; }

我的行动:

[Route("new")]
[HttpPost]
public ActionResult NewMessageLayout(ManageMessageLayoutDto model)
{
    if (ModelState.IsValid)
    {
        var response = Repositories.MessageLayoutRepository.SaveMessageLayout(model, CurrentUser.Id);

        if (response.Status == ResultStatus.Success)
        {
            return RedirectToAction("MessageManagement");
        }

        else
        {
            ModelState.AddModelError("error", response.Message);
            return View("ManageMessageLayout", model);
        }
    }

    return View("ManageMessageLayout", model);
}

还有一些HTML:

@using (Html.BeginForm())
{
    @Html.HiddenFor(m => m.Id)

    <label>Name <span class="req">*</span></label>
    @Html.TextBoxFor(m => m.Name, new { @class = "form-control" })
    @Html.ValidationMessageFor(m => m.Name, null, new { @class = "label label-danger" })

    <label>Content <span class="req">*</span></label>
    @Html.TextBoxFor(m => m.HtmlBody)
    @Html.ValidationMessageFor(m => m.HtmlBody, null, new { @class = "label label-danger" })

    <input class="btn btn-success btn-block btn-lg" type="submit" value="@(editing ? "Save" : "Add")" />
}

2 个答案:

答案 0 :(得分:2)

我无法复制您的错误。但是,我确实注意到了一些事情。首先,根据ckEditor文档,textbox不是编辑器的有效附加点。您应该使用textarea

CkEditor Developer Documentation

  

此时,任何textarea,p或div元素都可以转换为   使用ckeditor()方法的富文本编辑器。

接下来,请注意我已将AllowEmptyStrings=false添加到[Required(属性中。这可能是您遗漏的重要部分(将在没有测试的情况下) - 测试似乎表明不设置AllowEmptyStrings不会影响此测试设置的结果default value for this property is false。该模型仍然无效。

设置

  1. VS 2015,MVC 5.2.2,.NET 4.5.1,jQuery 1.10.2,ckEditor 3.6.4
  2. 查看模型

    public class TestViewModel
    {
        [AllowHtml]
        [Required(AllowEmptyStrings = false, ErrorMessage = "This should be filled out")]
        [StringLength(4000, ErrorMessage="Its too big")]
        public string HtmlBody { get; set; } 
    }
    

    控制器操作

        public ActionResult About()
        {
            return View(new TestViewModel());
        }
    
        [HttpPost]
        public ActionResult About(TestViewModel model)
        {
            if (!ModelState.IsValid) throw new Exception();
            var test = model.HtmlBody;
            return RedirectToAction("Contact");
        }
    

    查看

    @model WebApplication6.Models.TestViewModel
    
    @{
        ViewBag.Title = "About";
    }
    <h2>Test of HTML</h2>
    
    @using (Html.BeginForm())
    {
        <label>Content <span class="req">*</span></label>
        @Html.TextAreaFor(m => m.HtmlBody)
        @Html.ValidationMessageFor(m => m.HtmlBody, null, new { @class = "label label-danger" })
        <input type ="submit" value="test on server"/>
    }
    
    @section scripts
    {
        <script type="text/javascript">
        $(function () {
            $('#HtmlBody').ckeditor();
        });
    </script>
    }
    

    <强>结果:  基本上,抛出异常是因为模型状态无效 enter image description here

答案 1 :(得分:1)

我发现了问题。

我的表示层使用的是System.Web.Mvc的5.2.2.0版本,但存储库层使用的是5.2.3.0。我把它降级到5.2.2.0。现在它正常运作。