我正在尝试使用一个简单的表单,允许授权用户修改我正在构建的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个单独的值 - 一个用于模型中的每个属性,而不是将模型类传递回控制器。我无法弄清楚我需要改变什么以使其正常工作。
我希望我错过了一些简单的东西,而且眼睛更好的人可以看到它是什么。
答案 0 :(得分:3)
因此,在进一步研究ASP MVC如何将表单字段映射到模型类并检查发布到浏览器的HTML之后,我发现这是我的WebContent类中属性名称的问题。
public virtual String content { get; set; }
TinyMCE编辑器使用内容变量来定义与编辑器界面相关的某些特征。这显然导致编辑器中用户输入生成的HTML“内容”无法映射回Model属性。
只需更改模型类中属性的名称(当然也可以修复相应的数据库映射和视图引用),即可解决问题。
public virtual String web_data_content { get; set; }
其他所有内容都相同,这与UIHint和AllowHTML属性完美配合。
答案 1 :(得分:2)
在您的操作中添加此属性
[ValidateInput(false)]
这应该可以解决您的问题
答案 2 :(得分:0)
如果你使用ie7 这可能有些错误
<input type="submit" value="Update" />
给按钮命名