MVC Razor表单提交不起作用。

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属性应该允许提交此内容,但由于某种原因它没有生效。

我可以通过在HttpPost控制器方法中添加[ValidateInput(false)]属性来解决这个问题。如果我这样做,那么就不会发生此异常,但是模型仍然无法传递到控制器。它只会传递null。在调试器中检查HttpContext表明,它会传递4个单独的值——每个模型属性一个,而不是将整个模型类返回给控制器。我无法找出需要更改的内容以使其正常工作。

我希望这是我忽略的一些简单问题,期待有更好的眼力看到它是什么。


1
https://dev59.com/6F_Va4cB1Zd3GeqPQSK1 - Bassam Mehanni
同意。你的代码看起来很棒。可能存在一些冲突的框架。 - Dave Alperovich
有没有一种方法可以确定可能存在的“冲突框架”?我已经阅读了Bassam上面链接的问题,但我不认为我的项目中有任何类似的东西。我以一个空的MVC 3项目作为起点,我添加的唯一内容是MySQL NET/Connector、NHibernate和TinyMCE。我不认为这些内容会导致表单出现这种问题。有没有办法可以查明原因? - ASmith
3个回答

3

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

public virtual String content { get; set; }

TinyMCE编辑器使用content变量来定义与编辑器界面相关的某些特征。显然,这导致用户在编辑器中输入的HTML“content”无法映射回模型属性。
仅仅更改模型类中属性的名称(当然还要修复相应的数据库映射和视图引用)即可立即解决问题。
public virtual String web_data_content { get; set; }

其他条件相同的情况下,使用UIHint和AllowHTML属性可以完美地解决此问题。


2
在你的操作上添加这个属性。
[ValidateInput(false)]

这应该可以解决你的问题。

在我上面的描述中,我指出在操作上使用ValidateInput(false)确实消除了异常,但我的模型仍然没有正确地传递到控制器。请参见上面的最后一段。 - ASmith

0

如果您使用的是IE7,可能会出现一些错误。

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

给这个按钮起一个名称


我会记住这个关于浏览器支持的提示,但我现在正在使用火狐进行测试。 - ASmith

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接