3

我正在尝试使用一个简单的表单来允许授权用户修改我正在构建的 MVC3 Razor 站点上的选定页面上的内容。我无法让编辑表单正确发布。

我的模型如下:

public class WebContent
{
    public virtual UInt32 id { get; set; }
    public virtual String page { get; set; }
    public virtual String section { get; set; }

    [UIHint("tinymce_jquery_full"), AllowHtml]
    public virtual String content { get; set; }
}

我的控制器:

    [Authorize]
    public ActionResult Edit(String page, String section)
    {
        WebContent content = _WebContent.GetSection(page,section);
        return View(content);
    }

    [Authorize]
    [HttpPost]
    public ActionResult Edit(WebContent content)
    {
        if (ModelState.IsValid)
        {
            _WebContent.Update(content);
            return View("Index");
        }
        else return View("Index");
    }

我的观点:

@model SongbirdsStudios.Models.WebContent
@{
  ViewBag.Title = "Edit '"+Model.page+"'Page Content";
}

<div>
<h2>Edit</h2>
@using (Html.BeginForm())
{

    <fieldset>
        <legend>Page Content</legend>
        @Html.HiddenFor(m => m.id)
        @Html.HiddenFor(m => m.page)
        @Html.HiddenFor(m => m.section)
        <div class="editor-label">
            Content
        </div>
        <div class="editor-field">
            @Html.EditorFor(m => m.content)
        </div>
        <p>
            <input type="submit" value="Update" />
        </p>
    </fieldset>
}
</div>

视图正确呈现并显示预期的元素。UIHint("tinymce_jquery_full") 被正确拾取,TinyMCE 编辑器出现在页面上。但是,当表单提交时,我得到了一个例外。

System.Web.HttpRequestValidationException: A potentially dangerous Request.Form value was detected from the client (content=...)

我读过的所有内容都表明 AllowHTML 属性应该允许发布,但这不是出于某种原因。

我可以通过将 [ValidateInput(false)] 属性添加到 HttpPost 控制器方法来解决此问题。如果我这样做,则不会发生此异常,但模型仍然不会传递给控制器​​。它只是通过 null 代替。检查调试器中的 HttpContext 表明它传递了 4 个单独的值 - 我的模型中的每个属性一个,而不是将模型类传递回控制器。我不知道我需要更改什么才能使其正常工作。

我希望我错过了一些简单的东西,并且有更好眼睛的人可以看到它是什么。

4

3 回答 3

3

因此,在进一步调查 ASP MVC 如何将表单字段映射到模型类并检查发送到浏览器的 HTML 之后,我发现这是我的 WebContent 类中的属性名称的问题。

public virtual String content { get; set; }

TinyMCE 编辑器使用内容变量来定义与编辑器界面相关的某些特征。这显然导致编辑器中用户输入生成的 HTML“内容”没有映射回 Model 属性。

只需更改模型类中的属性名称(当然还要修复相应的数据库映射和视图引用)即可立即解决问题。

public virtual String web_data_content { get; set; }

其他一切都相同,这与 UIHint 和 AllowHTML 属性完美配合。

于 2013-02-01T03:30:50.917 回答
2

在您的操作中添加此属性

[ValidateInput(false)]

这应该可以解决您的问题

于 2013-01-30T06:49:09.220 回答
0

如果你使用 ie7 这可能会出错

<input type="submit" value="Update" /> 

给按钮一个名字

于 2013-01-30T06:14:14.740 回答