Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/asp.net-mvc-3/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Asp.net mvc MVC 3 RTM AllowTML不';使用FormCollection时无法工作_Asp.net Mvc_Asp.net Mvc 3 - Fatal编程技术网

Asp.net mvc MVC 3 RTM AllowTML不';使用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); } 潜在危险的请

MVC3RTM。具有具有AllowHtml属性的模型。在我的控制器操作中,如果该操作将FormCollection作为参数,则会引发异常:

 [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感谢您的评论。