Golang中HTML提交按钮的问题如何解决

Golang中HTML提交按钮的问题如何解决 你好,我似乎无法让代码在使用模板的提交按钮上正常工作。文本似乎会显示为上一次点击的内容,而不是最新的点击,而且函数在每次点击时似乎会运行两次。我哪里做错了?

我使用的 Go 代码如下:

Package main

import (
	"text/template"
	"log"
	"net/http"
	"fmt"
)

var modeType string = ""

type PageVariables struct {
        Mode string
      }


func whatPressed(w http.ResponseWriter, r *http.Request) {
		HomePageVars := PageVariables{ 
		Mode: modeType,
    	}
		
        t, _ := template.ParseFiles("test1.html")
        t.Execute(w, HomePageVars)
        r.ParseForm()
        
        if _, exist := r.Form["normal"]; exist { modeType = "Normal Mode"}
        if _, exist := r.Form["insert"]; exist { modeType = "Insert Mode"}
        if _, exist := r.Form["edit"]; exist { modeType = "Edit Mode"}

fmt.Println("Pressed")
fmt.Println(r.Form)
    
}


func main() {
	
	    http.HandleFunc("/", whatPressed) // setting router rule
       err := http.ListenAndServe(":8080", nil) // setting listening port
           if err != nil {
           log.Fatal("ListenAndServe: ", err)
    }

}

我使用的模板 - test1.html - 如下:

<table bgcolor="#ffffff" width=800>
 <tr>
  <td width="20%" align=left><form method=post><input type="hidden" name="edit" value="1"><input type="submit" value="Edit"></form></td>
  <td width="20%" align=left><form  method=post><input type="hidden" name="insert" value="1"><input type="submit" value="Insert"></form></td>
  <td width="20%" align=left><form  method=post><input type="hidden" name="normal" value="1"><input type="submit" value="Normal"></form></td>
  <td width="20%" align=left> </td>
 </tr>
</table>
<br><br><p>{{.Mode}} has been clicked on</p>

非常感谢。


更多关于Golang中HTML提交按钮的问题如何解决的实战教程也可以访问 https://www.itying.com/category-94-b0.html

5 回复

成功了。非常感谢您的帮助。

更多关于Golang中HTML提交按钮的问题如何解决的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


有时,问题是由浏览器缓存的旧版本JavaScript文件引起的,可以通过清除浏览器缓存来解决。 您可以使用浏览器的控制台进行调试。修复JavaScript错误后,提交按钮将自动启用。

Picsart for window free download

你能解释一下这几行代码是如何工作的吗?这样我理解起来会更容易。 如果你有任何想法,请继续说明以帮助他人。 谢谢。

嗨 Dunsfold,HomePageVars 应该在表单存在性检查中为 modeType 赋值之后进行声明。这就是为什么你首先会得到一个空字符串值,并且你在表单操作之前就执行了模板。以下是 whatPressed 函数中的代码实现:

func whatPressed(w http.ResponseWriter, r *http.Request) {
	
     r.ParseForm()

     if _, exist := r.Form["normal"]; exist { modeType = "Normal Mode" }
     if _, exist := r.Form["insert"]; exist { modeType = "Insert Mode" }
     if _, exist := r.Form["edit"]; exist { modeType = "Edit Mode" }

     HomePageVars := PageVariables{ 
	     Mode: modeType,
     }

     fmt.Println("Pressed")
     fmt.Println(r.Form)
	
     t, _ := template.ParseFiles("test1.html")
     t.Execute(w, HomePageVars)
}

你的代码存在两个主要问题:1) 执行顺序错误导致数据滞后 2) 表单处理逻辑有缺陷。以下是修正后的代码:

package main

import (
    "html/template"
    "log"
    "net/http"
)

type PageVariables struct {
    Mode string
}

func whatPressed(w http.ResponseWriter, r *http.Request) {
    var modeType string
    
    // 先处理POST请求,再渲染模板
    if r.Method == http.MethodPost {
        r.ParseForm()
        
        if _, exist := r.Form["normal"]; exist {
            modeType = "Normal Mode"
        }
        if _, exist := r.Form["insert"]; exist {
            modeType = "Insert Mode"
        }
        if _, exist := r.Form["edit"]; exist {
            modeType = "Edit Mode"
        }
    }
    
    HomePageVars := PageVariables{
        Mode: modeType,
    }
    
    t, err := template.ParseFiles("test1.html")
    if err != nil {
        http.Error(w, err.Error(), http.StatusInternalServerError)
        return
    }
    
    t.Execute(w, HomePageVars)
}

func main() {
    http.HandleFunc("/", whatPressed)
    err := http.ListenAndServe(":8080", nil)
    if err != nil {
        log.Fatal("ListenAndServe: ", err)
    }
}

模板文件test1.html保持不变:

<table bgcolor="#ffffff" width=800>
 <tr>
  <td width="20%" align=left><form method=post><input type="hidden" name="edit" value="1"><input type="submit" value="Edit"></form></td>
  <td width="20%" align=left><form method=post><input type="hidden" name="insert" value="1"><input type="submit" value="Insert"></form></td>
  <td width="20%" align=left><form method=post><input type="hidden" name="normal" value="1"><input type="submit" value="Normal"></form></td>
  <td width="20%" align=left> </td>
 </tr>
</table>
<br><br><p>{{.Mode}} has been clicked on</p>

主要修改:

  1. 移除了全局变量modeType,改为函数内局部变量
  2. r.ParseForm()移到模板渲染之前
  3. 添加了HTTP方法检查r.Method == http.MethodPost
  4. text/template改为html/template以获得更好的HTML转义
  5. 添加了模板解析错误处理

这样修改后,点击按钮会立即显示当前点击的模式,且函数只执行一次。

回到顶部