Asp.net mvc MVC 3 RTM AllowTML不';使用FormCollection时无法工作
MVC3RTM。具有具有AllowHtml属性的模型。在我的控制器操作中,如果该操作将FormCollection作为参数,则会引发异常:Asp.net mvc MVC 3 RTM AllowTML不';使用FormCollection时无法工作,asp.net-mvc,asp.net-mvc-3,Asp.net Mvc,Asp.net Mvc 3,MVC3RTM。具有具有AllowHtml属性的模型。在我的控制器操作中,如果该操作将FormCollection作为参数,则会引发异常: [HttpPost] public ActionResult Edit(FormCollection collection, int id) { var myEntity = _myRepo.Get(id); TryUpdateModel(myEntity); return DoSave(myEntity); } 潜在危险的请
[HttpPost]
public ActionResult Edit(FormCollection collection, int id)
{
var myEntity = _myRepo.Get(id);
TryUpdateModel(myEntity);
return DoSave(myEntity);
}
潜在危险的请求。表单
从客户端检测到值
但是,如果我的控制器操作使用对象而不是FormCollection,则不会引发异常
[HttpPost]
public ActionResult Edit(MyEntity postedEntity, int id)
{
var myEntity = _myRepo.Get(id);
TryUpdateModel(myEntity);
return DoSave(myEntity);
}
我已经安装好了
httpRuntime
requestValidationMode=“2.0”
为什么在使用FormCollection时失败 不能将
allowtml
与FormCollection
一起使用。您可以使用该属性,但显然这会禁用对所有值的验证:
[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);
}
出于安全原因,简单地禁用验证并不是一个好的解决方案,因为您无意中完全禁用了该操作方法的安全性 当您只需要一个GET或POST值时,这是非常烦人的—例如,
Request.Params[“xyz”]
将在GET/POST数据中的任何位置有HTML值时抛出,即使您发布的“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;
}
//
///从当前控制器的ValueProvider获取值,绕过后期数据验证。
///
公共字符串GetUnvalidatedValue(字符串键)
{
ValueProviderResult结果;
如果(ValueProvider是IUnvalidatedValueProvider)
{
结果=((IUnvalidatedValueProvider)ValueProvider)
.GetValue(键,skipValidation:true);
}
其他的
{
结果=ValueProvider.GetValue(键);
}
返回结果==null?null:result.AttemptedValue;
}
这有效地允许您在绕过验证的同时获取单个get/POST值
我相信这比完全关闭验证更好、更安全、更正确——您的应用程序确实从增加的安全性中受益,即使它的实现方式受到阻碍,而且显然是非常痛苦的
(我不认为这是出于设计,或者至少不是出于非常好的设计…Thx Darin。啊,这很烦人,这就是我目前正在做的,但因为我仍然有RC 2的代码剩余,我希望不必这样做…你知道它不能与formcollection一起工作的原因吗?@B Z,原因是默认模型绑定器在操作之前运行,因此除非使用强类型的操作参数(我建议使用强类型的操作参数),否则无法对其执行太多操作。绑定
FormCollection
时,默认模型绑定器不起作用的一个简化原因是,没有任何东西与您拥有的allowtml
在当前执行请求的某个类的某些属性上定义。@marcind+1感谢您的评论。