ASP.NET MVC AllowHtml错误或我没有正确使用的东西

时间:2011-11-21 22:21:28

标签: 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; }
}

这是我的控制器代码

[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”]时,它抛出了错误。是我缺少的东西吗?

由于

更新

对不起,Adam给出的答案并没有真正回答我的问题。任何人都可以提出更多建议吗?

2 个答案:

答案 0 :(得分:2)

理想情况下,你不应该真的使用它们。即使可以“使用”,这些也是更多以Web窗体为中心的值。

传入一个FormsCollection项并使用collection [“Button”]检查它甚至更好 - 你的取消按钮本身应该只是重定向。为什么只在重定向时什么都不发布?

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

答案 1 :(得分:1)

HttpRequest.Params getter抛出此异常。此getter基本上构建并返回一个键/值对集合,它是该顺序中QueryString,Form,Cookies和ServerVariables集合的集合。现在重要的是,当你使用这个getter时,无论你是否在某个模型属性上使用了[AllowHtml]属性,或者是否使用[ValidateInput(false)]属性修饰了控制器操作,它总会执行请求验证并禁用所有输入验证。

所以这不是AllowHtml属性中的错误。这是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
}