AllowHtml属性不起作用

时间:2011-02-01 11:25:12

标签: c# asp.net-mvc-3 model-binding

我有一个具有此属性的模型:

     [AllowHtml]
     [DisplayName("Widget for Table")]
     [StringLength(1000, ErrorMessage = "Maximum chars 1000")]
     [DataType(DataType.Html)]
     public object TableWidget { get; set; }

这是控制器中的创建方法:

  //
  // GET: /Admin/Table/Create

  public ActionResult Create(int id)
  {
     Season season = _seasonRepository.GetSeason(id);

     var table = new Table
                     {
                        SeasonId = season.SeasonId
                     };
     return View(table);
  }

  //
  // POST: /Admin/Table/Create

  [HttpPost]
  public ActionResult Create(Table a)
  {
     if (ModelState.IsValid)
     {
        _tableRepository.Add(a);
        _tableRepository.Save();
        return RedirectToAction("Details", "Season", new { id = a.SeasonId });
     }
     return View();
  }

最后这是我的观点:

@model Stridh.Data.Models.Table
@using (Html.BeginForm())
{
   @Html.ValidationSummary(true)
   <fieldset>
      <legend>Fields</legend>
      <div class="editor-label">
         @Html.LabelFor(model => model.Name)
      </div>
      <div class="editor-field">
         @Html.EditorFor(model => model.Name) @Html.ValidationMessageFor(model => model.Name)
      </div>
      <div class="editor-label">
         @Html.LabelFor(model => model.TableURL)
      </div>
      <div class="editor-field">
         @Html.EditorFor(model => model.TableURL) @Html.ValidationMessageFor(model => model.TableURL)
      </div>
      <div class="editor-label">
         @Html.LabelFor(model => model.SortOrder)
      </div>
      <div class="editor-field">
         @Html.EditorFor(model => model.SortOrder) @Html.ValidationMessageFor(model => model.SortOrder)
      </div>
      <div class="editor-label">
         @Html.LabelFor(model => model.TableWidget)
      </div>
      <div class="editor-field">
         @Html.EditorFor(model => model.TableWidget) @Html.ValidationMessageFor(model => model.TableWidget)
      </div>
      <div class="editor-label invisible">
         @Html.LabelFor(model => model.SeasonId)
      </div>
      <div class="editor-field invisible">
         @Html.EditorFor(model => model.SeasonId)
      </div>
      <p>
         <input type="submit" value="Create" />
      </p>
   </fieldset>
} 

当我在没有html的情况下添加“正常”消息时,一切都保存好了,但是在保存时它说有一个潜在危险的Request.Form ......

另一个奇怪的事情是我让这个[AllowHtml]在另一个模型类中工作。我不知道为什么这会让我烦恼。需要你的帮助。 : - )

5 个答案:

答案 0 :(得分:16)

您使用AllowHtml的方式应该有效。确保您没有访问代码中任何其他位置的HttpRequest.Form集合(控制器,过滤器等),因为这将触发ASP.NET请求验证和您看到的错误。如果您确实想要访问该变量,那么您应该通过以下代码访问它。

using System.Web.Helpers;

HttpRequestBase request = ..  // the request object
request.Unvalidated().Form;

答案 1 :(得分:4)

我遇到了同样的问题,我在this post的帮助下解决了这个问题。

如果您使用的是.net 4.0,请确保将其添加到web.config

<httpRuntime requestValidationMode="2.0" />

<system.web>代码

答案 2 :(得分:3)

我遇到了同样的问题。我的模型类名为&#34; GeneralContent&#34;并拥有财产&#34;内容&#34;。在我的动作方法中,我使用了这样的属性:

公共ActionResult更新(GeneralContent内容)

当我将内容参数重命名为cnt时,一切运行良好。我认为当模型类的某些属性与action方法中的参数同名时,MVC会感到困惑。

答案 3 :(得分:1)

我也遇到过这个问题。我无法获得标有[AllowHtml]的模型属性来实际允许HTML,而是遇到了您描述的相同错误。我的解决方案最终是标记Controller操作,该操作接受具有[ValidateInput(false)]属性的已发布模型。

答案 4 :(得分:0)

@marcind的回答使我处在正确的轨道上,但我的问题是我正在将FormCollection传递到Controller方法中,因此请更改此...

public ActionResult Edit(MyClass myClass, FormCollection collection)

对此...

public ActionResult Edit(MyClass myClass)

解决了问题。

随后,我能够使用类似这样的代码访问表单集合中的所有内容。

foreach (var key in Request.Form.AllKeys)
{
   ...
}

因此,导致问题的原因是传递表单集合参数,而不仅仅是访问表单集合。