MVC ASP.NET MVC3 AllowHtml属性不起作用?

时间:2011-01-22 01:58:53

标签: asp.net-mvc-3

问题很简单:

假设您有一个名为Person的模型

public class Person
{

       public int PersonID {get; set;}

       public string Name {get; set;}

       [AllowHtml] // Allow html in Intro property
       public string Intro {get; set;}

       [ScaffoldColumn(false)]
       public string ComplicatedValue {get; set;}

}

在控制器的“创建操作”

[HttpPost]
public ActionResult Create(Person o, FormCollection collection)
{

// whatever code here;

}

如果你运行它,

  1. 为简介输入纯文本,没有 问题发生了。
  2. 输入Intro的html内容,无论你如何设置 你的配置文件,它会 告诉“潜在的危险......”
  3. 我找到了这个问题的原因。

    如果将功能更改为

    public ActionResult Create(Person o) // Get rid of the *FormCollection collection*
    {
    
    // whatever code here;
    
    }
    

    这将消除“潜在的危险”错误。

    但我的问题是我的应用程序,我必须在Create Action方法中使用辅助参数 FormCollection集合,因为我需要使用其他一些控件值和server变量将计算值分配给 ComplicatedValue 属性。

    如果ASP.NET MVC3的任何专家遇到了和我一样的问题,并找到了解决方案,请告诉我。

3 个答案:

答案 0 :(得分:7)

此链接中的此论坛详细讨论了此问题并提供了一些解决方法。

http://forums.asp.net/p/1621677/4161637.aspx

以下是该主题的一个解决方案,可能适用于您,也可能不适用于您:

public ActionResult Create(Person o) // Get rid of the *FormCollection collection*
{    
FormCollection form = new FormCollection(Request.Unvalidated().Form);
// whatever code here;
}

或我自己的建议:

public ActionResult Create(Person o, int otherControlValue1, int otherControlValue2, ...)
{        
      o.ComplicatedValue = CalculateComplicatedValue(otherControlValue1, otherControlValue2, ...);
      // whatever code here.

}

在我的情况下,我没有使用FormCollection,但它就在那里,所以我在[HttpPost]方法上有不同的足迹。我做了这个黑客并输入了一个伪造的参数:

public virtual ActionResult Edit(int id)
{
    return View(this.repository.GetById(id));
}
[HttpPost]
public virtual ActionResult Edit(int id, int? bogusID)
{            
    var d = repository.GetById(id);
    if (TryUpdateModel(d))
    {
        repository.Save();
        return RedirectToAction("Index");
    }
    return View();
}

答案 1 :(得分:2)

我建议使用自定义模型绑定器而不是从FormCollection中提取复杂数据。 Scott Hanselman有一篇关于创建自定义模型绑定器的blog帖子,该绑定器可以作为一个很好的模板。在他的帖子中,他将DateTimeModelBinder放在一起,允许DateTime属性由包含日期的单个输入或包含日期和时间的一对输入设置。

答案 2 :(得分:0)

你试过吗

  

[装订(排除 = “ComplicatedValue”)]

[HttpPost]
public ActionResult Create([Bind(Exclude="ComplicatedValue")]Person o)
{
}

它允许您在表单上排除 ComplicatedValue 属性,并仍然将对象作为 Person 类提交。

希望有所帮助