我想用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")" />
}
答案 0 :(得分:2)
我无法复制您的错误。但是,我确实注意到了一些事情。首先,根据ckEditor文档,textbox
不是编辑器的有效附加点。您应该使用textarea
。
CkEditor Developer Documentation
此时,任何textarea,p或div元素都可以转换为 使用ckeditor()方法的富文本编辑器。
接下来,请注意我已将AllowEmptyStrings=false
添加到[Required(
属性中。这可能是您遗漏的重要部分(将在没有测试的情况下) - 测试似乎表明不设置AllowEmptyStrings不会影响此测试设置的结果default value for this property is false。该模型仍然无效。
设置
查看模型
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>
}
答案 1 :(得分:1)
我发现了问题。
我的表示层使用的是System.Web.Mvc
的5.2.2.0版本,但存储库层使用的是5.2.3.0。我把它降级到5.2.2.0。现在它正常运作。