asp.net MVC - MVC 剃须刀表单提交不起作用



我正在尝试使用一个简单的表单来允许授权用户修改我正在构建的 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 控制器方法来解决此问题。如果我这样做,则不会发生此异常,但模型仍然不会传递给控制器。 它只是传递空值。 在调试器中检查 HttpContext 表明它正在传递 4 个单独的值 - 模型中的每个属性一个值,而不是将模型类传递回控制器。 我不知道我需要更改什么才能使其正常工作。

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

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

public virtual String content { get; set; }

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

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

public virtual String web_data_content { get; set; }

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

在操作中添加此属性

[ValidateInput(false)]

这应该可以解决您的问题

如果您使用 ie7这可能有一些错误

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

为按钮命名

最新更新