Asp.net mvc 3 ASP.NET MVC AllowHtml bug或其他我不知道的东西';不能正确使用

Asp.net mvc 3 ASP.NET MVC AllowHtml bug或其他我不知道的东西';不能正确使用,asp.net-mvc-3,Asp.net Mvc 3,我的模型包含一个名为“longdescription”的字符串字段,它获取tinymce编辑器内容的值 Public class ArticleModel:BaseModel{ [StringLength(8000, ErrorMessage = "Long description must be in 8000 characters or less"), AllowHtml] public string LongDescription { get; set; }

我的模型包含一个名为“longdescription”的字符串字段,它获取tinymce编辑器内容的值

Public class ArticleModel:BaseModel{
            [StringLength(8000, ErrorMessage = "Long description must be in 8000 characters or less"), AllowHtml]
    public string LongDescription { get; set; }
}
这是我的控制器代码

[HttpPost]
public ActionResult AddEdit(ArticleModel model)
{
    string buttonName = Request.Form["Button"];
    if (buttonName == "Cancel")
        return RedirectToAction("Index");

    // something failed
    if (!ModelState.IsValid)
    {

     }

    // Update the articles
  }
我的问题是,当我使用Request.Form访问post值时,它工作正常,不会抛出“潜在危险…”错误,但当我使用Request.Params[“Button”]时,它抛出了该错误。是不是我错过了什么

谢谢

已更新


对不起,亚当给出的答案并没有真正回答我的问题。有人能再提些建议吗

理想情况下,您不应该真正使用这两种方法。这些都是以Web表单为中心的价值观,即使它们“可以”使用

传入FormsCollection项并使用collection[“Button”]检查它,或者更好—您的“取消”按钮本身可能只是执行重定向。除了重定向什么都不做,为什么还要发帖

在您的视图中,您可以通过url.Action()发出url,并将其放入按钮的单击处理程序(客户端)

引发此异常的是getter。这个getter基本上构建并返回一个键/值对集合,它是QueryString、Form、Cookie和ServerVariables集合按该顺序的聚合。现在重要的是,当您使用此getter时,它将始终执行请求验证,无论您是对某些模型属性使用
[AllowHtml]
属性,还是使用
[ValidateInput(false)]
属性修饰控制器操作并禁用所有输入验证

所以这实际上不是
allowtml
属性中的错误。这就是
Params
属性的设计方式

正如@Adam在他的回答中提到的,您应该避免手动访问请求值。您应该使用值提供程序,它会考虑到某些字段的禁用请求验证等情况

因此,只需向视图模型添加另一个属性:

public class ArticleModel: BaseModel
{
    [StringLength(8000, ErrorMessage = "Long description must be in 8000 characters or less")]
    [AllowHtml]
    public string LongDescription { get; set; }

    public string Button { get; set; }
}
然后在控制器操作中:

[HttpPost]
public ActionResult AddEdit(ArticleModel model)
{
    string buttonName = model.Button;
    if (buttonName == "Cancel")
    {
        return RedirectToAction("Index");
    }

    // something failed
    if (!ModelState.IsValid)
    {

    }

    // Update the articles
}

javascript受到我们客户端的限制,如果我们使用js,我们还需要准备非js版本,这为我们增加了额外的工作。我使用FormsCollection,但有时调用request.xxx非常方便。无论如何,我的问题是为什么Request.Form可以工作,但Request.Params不能工作。现在使用FormsCollection并不是那么容易。我确实充分利用了mvc模型绑定将表单数据绑定到我的模型中,我不想更改我的操作以接收FormsCollection,然后尝试将值重新绑定到我的模型中。这个答案假设您知道编译时所有表单字段都是什么。如果在运行时生成表单字段,该怎么办。我有一个例子,我需要在运行时生成数量不确定的表单字段。使用Request.Params可以很好地工作,直到我想在输入中允许html。