0

mvc-request.params get例外の最初の「get」結果、2番目の「get」は問題ありません。xmlテキストを含むフィールドがあるページがあります。私はvalidation=falseを使用しています。しかし、コントローラーのpostメソッドで、requset.paramsを取得しようとすると、「潜在的に危険なRequest.Form値がクライアントから検出されました」というエラーが表示されます。いくつか掘り下げてデバッグした後、初めてrequest.paramsを取得しようとすると例外が発生しますが、2回目に取得しようとするとすべて問題ありません。

これは、xmlの問題を回避するために使用しているフィルターです(バイナリデータに変換し、xml文字列フィールドを空にします)。

   public class RestAPIAttribute : ActionFilterAttribute
    {
        public override void OnActionExecuting(ActionExecutingContext filterContext)
        {
                 ((SimulationModel)filterContext.ActionParameters["model"]).Data = CommonConverters.StringToByteArray(((SimulationModel)filterContext.ActionParameters["model"]).StringData);
            ((SimulationModel)filterContext.ActionParameters["model"]).StringData = string.Empty;


            base.OnActionExecuting(filterContext);
        }
    }

これはpostメソッドです:

   [HttpPost]
    [ValidateInput(false)]
    [RestAPIAttribute]
    public ActionResult EditSimulation(Guid id, SimulationModel model)
    {
        try
        {
            model.RelationModel = new RelationModel(false, this.Resource("Simulations.AddToObjects"), "SimulationToObjects", id, sessionId, Request.Params, new List<ObjectTypes>() { ObjectTypes.Entity, ObjectTypes.EntityType, ObjectTypes.Universe });
        }
        catch (Exception ex)
        {
            Logger.LogException(ex);
        }

        /* more code here*/

        return View(newModel);
    }

ご覧のとおり、RelationModelのコンストラクターの1つにrequest.paramのパラメーターがあり、問題が発生しています。

この問題に対する私の現在の回避策は、2回呼び出すだけです(ただし、より良い解決策または少なくとも説明を探しています):

   [HttpPost]
    [ValidateInput(false)]
    [RestAPIAttribute]
    public ActionResult EditSimulation(Guid id, SimulationModel model)
    {
        try
        {
             try
            {
                model.RelationModel = new RelationModel(false, this.Resource("Simulations.AddToObjects"), "SimulationToObjects", id, sessionId, Request.Params, new List<ObjectTypes>() { ObjectTypes.Entity, ObjectTypes.EntityType, ObjectTypes.Universe });
            }
            catch
            {
                model.RelationModel = new RelationModel(false, this.Resource("Simulations.AddToObjects"), "SimulationToObjects", id, sessionId, Request.Params, new List<ObjectTypes>() { ObjectTypes.Entity, ObjectTypes.EntityType, ObjectTypes.Universe });
            }
        }
        catch (Exception ex)
        {
            Logger.LogException(ex);
        }

        /* more code here*/

        return View(newModel);
    }
4

1 に答える 1

1

これがASP.NETMVC3+の場合[AllowHtml]、XMLを含むモデルプロパティの属性を使用できます。これにより、リクエスト全体ではなく、このプロパティに対してのみリクエストの検証が無効になります。

public class SimulationModel 
{ 
    [AllowHtml]
    public string StringData { get; set; } 
}

その後:

[HttpPost]
public ActionResult EditSimulation(Guid id, SimulationModel model)
{
    // you could directly use model.StringData here without any 
    // encoding needed

    return View(newModel);
}

また、これがASP.NET4.0で実行されているASP.NETMVC 2アプリケーションであり、コントローラーアクションを[ValidateInput(false)]属性で装飾することに加えて、web.configに次の情報を追加する必要がある場合があります。

<httpRuntime requestValidationMode="2.0"/>

ASP.NET MVC 3アプリケーションの場合、[ValidateInput(false)]属性を使用するためにこの行をweb.configに配置する必要はありません。

于 2012-08-19T12:01:40.947 に答える