首页 > 解决方案 > ASP.NET MVC 5 - 模型中有 HTML 内容的奇怪行为

问题描述

我正在开发基于 ASP.NET MVC 5 的功能来管理呈现为 html 的消息模板。在 viewmodel 中有 html-markup 会导致一些问题。

这些消息模板通过所见即所得编辑器进行编辑。

这是控制器的基本示例:

public class BlackboardController : Controller
{
    public ActionResult Template()
    {
        return View(new RichTextEditorViewModel()
        {
            Message = "<h1>I'm a headline</h1><p>I'm a regular text...</p>"
        });
    }

    [HttpPost]
    public ActionResult Template(RichTextEditorViewModel model)
    {
        if (!ModelState.IsValid)
            return View(model);

        return RedirectToAction("Template");
    }
}

模型的基本示例:

public class RichTextEditorViewModel
{
    [Required]
    [Display(Name = "Template name")]
    public string TemplateName { get; set; }

    [AllowHtml]
    [Display(Name = "Message")]
    public string Message { get; set; }
}

部分视图

@using (Html.BeginForm("Template", "Blackboard", FormMethod.Post, new { @class = "form-horizontal", role = "form" }))
{
    <div class="form-group">
        <label class="col-md-4 control-label">Message </label>
        <div class="col-md-8">
            <div class="input-group">
                @Html.TextAreaFor(m => m.Message, new { rows = "20", style = "resize:none;width:400px;", placeholder = Html.DisplayNameFor(m => m.Message), @class = "form-control input-lg textarea-editor" })
            </div>
        </div>
    </div>

    <div class="form-group">
        <div class="col-md-offset-2 col-md-10">
            <input type="submit" value="Save template" class="btn btn-default" />
        </div>
    </div>
}

当我将 html 标记发布到控制器操作时,一切正常。为了完成这项工作,我必须使用 AllowHtml 属性来装饰包含标记的模型属性。

但是:如果 ModelState 无效,例如 TemplateName 为空,那么我仍然会这样HttpRequestValidationException说:

“从客户端检测到潜在危险的 Request.Form 值”

我无法使用该基本示例重现该行为,但它发生在我更复杂的 Web 应用程序中。在某些站点上,我发现了这样的信息,即如果有任何东西触及控制器或视图的请求属性的属性,则会引发异常。试图解决这个问题,但似乎没有帮助。此外,我不知道哪些组件实际上正在访问请求或包含对该请求的引用。

怎么可能,如果 ModelState 有效,我就不会看到这个异常。HttpRequestValidationException当 ModelState 无效时,它怎么会被抛出。

标签: c#html.netasp.net-mvcexception

解决方案


推荐阅读