2011-02-16 40 views
3

MVC 3 RTM。有一个具有AllowHtml属性的模型。在我的控制器动作,如果动作具有的FormCollection作为参数,它会抛出异常:使用FormCollection时MVC 3 RTM allowHtml不起作用

[HttpPost] 
public ActionResult Edit(FormCollection collection, int id) 
{ 
    var myEntity = _myRepo.Get(id); 

    TryUpdateModel(myEntity); 

    return DoSave(myEntity); 
} 

如果我的控制器是从客户端检测到有潜在危险的Request.Form 值

然而操作使用一个对象而不是FormCollection它不抛出异常。

[HttpPost] 
public ActionResult Edit(MyEntity postedEntity, int id) 
{ 
    var myEntity = _myRepo.Get(id); 

    TryUpdateModel(myEntity); 

    return DoSave(myEntity); 
} 

我已经设置

的httpRuntime requestValidationMode = “2.0”

为什么使用的FormCollection时,它会失败?

回答

9

您不能使用AllowHtmlFormCollection。您可以使用[ValidateInput]属性,但显然这禁用验证所有值:

[HttpPost] 
[ValidateInput(false)] 
public ActionResult Edit(FormCollection collection, int id) 
{ 
    var myEntity = _myRepo.Get(id); 
    TryUpdateModel(objective); 
    return DoSave(objective); 
} 

这是说我会用以下内容:

[HttpPost] 
public ActionResult Edit(MyEntity entity) 
{ 
    if (ModelState.IsValid) 
    { 
     _myRepo.Save(entity); 
     return RedirectToAction("Success"); 
    } 
    return View(entity); 
} 
+0

THX达林。唉,这很烦人,这是我目前正在做的,但因为我仍然有RC 2剩下的代码,希望不必这样做......你知道它为什么不能与formcollection一起工作的原因吗? – 2011-02-16 21:15:46

2

为了安全起见,干脆禁用验证这是一个很好的解决方案,因为您无意中完全禁用了该操作方法的安全性。

当你只需要一个GET或POST价值,这是非常恼人的 - 例如,如果有一个HTML价值在你的GET/POST数据的任何地方Request.Params["xyz"]将抛出,即使您发布的"xyz"值不包含HTML。

(这是最新的MVC 3.1版本的真)

为了解决这个问题,我伸出我的控制器基类下面的方法:

/// <summary> 
    /// Gets a value from the current Controller's ValueProvider, bypassing post-data validation. 
    /// </summary> 
    public string GetUnvalidatedValue(string key) 
    { 
     ValueProviderResult result; 

     if (ValueProvider is IUnvalidatedValueProvider) 
     { 
      result = ((IUnvalidatedValueProvider)ValueProvider) 
       .GetValue(key, skipValidation: true); 
     } 
     else 
     { 
      result = ValueProvider.GetValue(key); 
     } 

     return result == null ? null : result.AttemptedValue; 
    } 

这有效地让你在绕过验证时获得单独的GET/POST值。

我相信这比完全关闭验证更好,更安全,更正确 - 即使实施方式阻碍了您的应用程序,您的应用程序也会从中受益,而且显然非常痛苦。

(我不认为这是由设计,或者至少不是很设计...)