【问题标题】:Best way to escape characters before jquery post ASP.NET MVC在 jquery 发布 ASP.NET MVC 之前转义字符的最佳方法
【发布时间】:2011-01-18 20:54:51
【问题描述】:

我是 ASP.NET MVC 的半新手。我正在为我的公司构建一个内部使用的应用程序。

场景是这样的:有两个Html.Listbox。一个拥有所有数据库信息,另一个最初是空的。用户会将数据库列表框中的项目添加到空列表框中。

每次用户添加命令时,我都会调用一个 js 函数,该函数会在我的 EditController 中调用 ActionResult "AddCommand"。在控制器中,将添加的选定项目保存到另一个数据库表中。

这是代码(每次添加项目时都会调用它):

函数添加(列表框){ ...
//跳过初始化代码以实现简洁

var url = "/Edit/AddCommand/" + cmd;

$.post(url);

}

因此,当“cmd”是具有“/”、“:”、“%”、“?”等(某种特殊字符)的项目时,就会出现问题

所以我想知道的是,逃避这些角色的最佳方法是什么?现在我正在检查数据库的列表框项目的文本,并重建字符串,然后在控制器中,我将那个构建的字符串恢复到原来的状态。

例如,如果他们添加的项目是“Cats/Dogs”,我会将“Cats[SLASH]Dogs”发布到控制器,并在控制器中将其更改回“Cats/Dogs”。

显然这是一个可怕的 hack,所以我一定遗漏了一些东西。任何帮助将不胜感激。

【问题讨论】:

    标签: javascript asp.net-mvc model-view-controller


    【解决方案1】:

    使用 javascript 转义,它会进行 urlencoding。

    Javascript encoding

    然后在 C# 中你可以简单地解码它。

    它看起来像这样

    function Add(listbox) { ...
    //skipping initializing code for berevity
    
    var url = "/Edit/AddCommand/" + escape(cmd);
    
    $.post(url);
    
    }
    

    【讨论】:

      【解决方案2】:

      在发送数据之前,您是否尝试过使用“转义”功能?这样,所有特殊字符都被编码为安全字符。在服务器端,您可以对值进行解码。

      function Add(listbox) { ...
      //skipping initializing code for berevity
      
      var url = "/Edit/AddCommand/" + escape(cmd);
      
      $.post(url);
      
      }
      

      【讨论】:

      • 请注意,在服务器端,框架会自动为您解码这些 URLEncodings。
      • escape() 不编码'/'。我尝试使用 encodeURIComponent(cmd),它几乎可以对每个特殊字符进行编码。当我使用任何一个时,我的控制器都不会被调用。
      【解决方案3】:

      您是否尝试过将 cmd 变量封装在对 escape() 的调用中?

      【讨论】:

        【解决方案4】:

        为什么不把它从 URI 中取出呢?你正在做一个POST,所以把它放在表单中。

        如果您的操作是:

        public ActionResult AddCommand(string cmd) { // ...
        

        ...那么你可以这样做:

        var url = "/Edit/AddCommand";
        var data = { cmd: cmd };
        $.post(url, data);
        

        ...一切都将“正常工作”,无需单独的编码步骤。

        【讨论】:

        • 是的,它奏效了。非常感谢,我什至不知道这个解决方案存在。只是让 MVC 变得更加糟糕。感谢您的提示!
        【解决方案5】:

        您可以将详细信息作为查询字符串传递。目前我猜你的动作是这样的:

        public virtual ActionResult AddCommand( string id )
        

        你可以改成:

        public virtual ActionResult AddCommand( string cmd )
        

        然后在你的javascript调用中:

        var url = "/Edit/AddCommand?cmd=" + cmd;
        

        这样你就不用担心编码了。

        如果您可以传递数据库项 id 而不是字符串,则更好的方法是。这可能对您的数据库也有更好的性能。

        【讨论】:

          猜你喜欢
          • 2011-12-02
          • 1970-01-01
          • 1970-01-01
          • 2012-01-28
          • 1970-01-01
          • 1970-01-01
          • 2019-06-28
          • 2010-10-12
          • 2011-06-04
          相关资源
          最近更新 更多