代码之家  ›  专栏  ›  技术社区  ›  Scott Melvin

更改窗体“method”不起作用,浏览器发出“GET”请求

  •  0
  • Scott Melvin  · 技术社区  · 8 年前

    我使用jquery创建一个简单的CRUD应用程序,通过JSON发送到FLASK后端。JSON查询工作正常。 我正在使用的HTML表单为“新”和“编辑”加倍,因此我更改“Actudio”属性和“方法”,以反映其是否正在创建新记录或编辑现有记录。

    这是表格。。。

    <div id="chardlg" class="easyui-dialog" title="Character" style="width:300px;padding:10px;" closed="true">
    <form id="cf" enctype="multipart/form-data" name="cf">
        <table>
            <tr>
                <td>Name:</td>
                <td><input name="name" class="easyui-textbox"></td>
            </tr>
            <tr>
                <td>Short Name:</td>
                <td><input name="short_name" class="easyui-textbox"></td>
            </tr>
            <tr>
                <td>Description:</td>
                <td><input name="description" class="easyui-textbox"></td>
            </tr>
            <tr>
                <td></td>
                <td><input type="submit" value="Submit"></td>
            </tr>
        </table>
    </form>
    

    这是我的javascript来操作表单。

    <script type="text/javascript">
    function newCharacter(){
        $('#chardlg').dialog('open').dialog('setTitle','New Character');
        $('#cf').attr('action', charactersurl);
        $('#cf').attr('method', 'POST');
        $('#cf').form('clear');
    }
    function editCharacter(){
        var row = $('#cg').datagrid('getSelected');
        if (row){
            $('#chardlg').dialog('open').dialog('setTitle','Edit Character');
            document.querySelector('#cf').action = basecharurl.concat(row.character_id);
            document.querySelector('#cf').setAttribute('method','PUT');
            //$('#cf').attr('action', basecharurl.concat(row.character_id));
            //$('#cf').attr('method', 'PUT');
            $('#cf').form('load', row);
        }
    }
    

    通过我的浏览器调试器,我可以看到每一行的属性都按预期发生了变化,但是当URL被提交时,我可以在FLASK控制台上看到一个“GET”方法,而不是正确的“PUT”或“POST”。URL的其余部分是正确的,如果我用'PUT'或'POST'测试它,它就会工作。

    您还将注意到,我已经注释掉了设置属性的jquery方法,但这只是为了证明我已经尝试了这两种方法。两个方法都设置了正确的属性,但查询仍然使用“GET”方法发送。

    编辑: 这里请求的是调用函数的jquery数据网格。。。

    $('#cg').datagrid({
        singleSelect:'true',
        url:charactersurl,
        method:'get',
        emptyMsg:'No Data available',
        toolbar:[{
            iconCls: 'icon-add',
            handler: function(){newCharacter()}
            },'-',{
            iconCls: 'icon-edit',
            handler: function(){editCharacter()}
            },'-',{
            iconCls: 'icon-remove',
            handler: function(){alert('Remove')}
        }],
        columns:[[
            {field:'name',title:'Name',width:100},
            {field:'short_name',title:'Short Name',width:100},
            {field:'description',title:'Description',width:120}
        ]]
    });
    

    如果我在HTML ie中设置窗体方法。。。

    <form id="cf" enctype="multipart/form-data" method='put' name="cf">
    

    它仍然将其作为“get”请求发送。唯一显式设置“get”的地方是在datagrid中,但是如果我删除datagrid默认为“POST”请求,并从FLASK后端获取400,因此不会填充datagrid。

    1 回复  |  直到 8 年前
        1
  •  0
  •   Scott Melvin    8 年前

    经过大量研究,发现HTML表单只支持GET和POST,不支持PUT和DELETE。当它是推荐的构建您的REST请求的方法时,非常令人沮丧。嘿,至少不是我的密码错了。