dsjbest2014 2017-04-19 16:15
浏览 294
已采纳

在beego中处理表单提交的正确方法是什么?

I'm trying to submit form data in beego and store it to database. And have some questions:

  • how correct handle request and transform it to object?
  • Should I validate request or transformed object?

My controller action:

func (c *ServicesController) Edit() {
    var err error
    var id, _ = c.GetUint64(":id")
    var serviceModel = models.Service{}
    var service models.Service

    service, err = serviceModel.FindById(id)

    c.Data["Service"] = service

    if err == orm.ErrNoRows || err == orm.ErrMissPK  {
        c.Abort("404")
    }

    if c.Ctx.Input.IsPost() {
        err = nil
        if err := c.ParseForm(&service); err != nil {
            c.Abort("500")
        }

        serviceModel.CreateOrUpdate(service)
    }

    c.TplName = "services/edit.html"
}

Model:

type Service struct {
    Id       uint64 `form:"-"`
    Name     string `orm:"size(100)" valid:"Required; MaxSize(100)" form:"name"`
}

func init() {
    orm.RegisterModel(new(Service))
}

func (s *Service) FindById(id uint64) (Service, error) {
    o := orm.NewOrm()
    service := Service{Id: id}
    err := o.Read(&service)

    return service, err
}

func (s *Service) CreateOrUpdate(service Service)  {
    o := orm.NewOrm()
    o.InsertOrUpdate(&service)
}

But when I'm trying to submit form (with InsertOrUpdate) it anyway creates new object because I have no id field in the form (because I retrieving object from id param from route). Should I pass id to form anyway or how to hack it?

  • 写回答

1条回答 默认 最新

  • dqnqpqv3841 2017-04-19 23:51
    关注

    Just add the ID after you parse the form:

    if err := c.ParseForm(&service); err != nil {
        c.Abort("500")
    }
    service.Id = id
    

    Looking through beego's source, I think you could do:

    if c.Ctx.Input.IsPost() {
        c.Input().Add("id", id)
        err = nil
        if err := c.ParseForm(&service); err != nil {
            c.Abort("500")
        }
    
        serviceModel.CreateOrUpdate(service)
    }
    

    But if not, I would just restructure your code a little bit:

    func (c *ServicesController) Edit() {
        var id, _ = c.GetUint64(":id")
        var service models.Service{}
        var serviceModel = models.Service{}
        var err error
    
        if c.Ctx.Input.IsPost() {
            if err = c.ParseForm(&service); err != nil {
                c.Abort("500")
            }
            service.Id = id
            serviceModel.CreateOrUpdate(service)
        } else {
            service, err = serviceModel.FindById(id)
            if err == orm.ErrNoRows || err == orm.ErrMissPK  {
            c.Abort("404")
        }
    
        c.Data["Service"] = service
        c.TplName = "services/edit.html"
    }
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

悬赏问题

  • ¥15 (希望可以解决问题)ma和mb文件无法正常打开,打开后是空白,但是有正常内存占用,但可以在打开Maya应用程序后打开场景ma和mb格式。
  • ¥20 ML307A在使用AT命令连接EMQX平台的MQTT时被拒绝
  • ¥20 腾讯企业邮箱邮件可以恢复么
  • ¥15 有人知道怎么将自己的迁移策略布到edgecloudsim上使用吗?
  • ¥15 错误 LNK2001 无法解析的外部符号
  • ¥50 安装pyaudiokits失败
  • ¥15 计组这些题应该咋做呀
  • ¥60 更换迈创SOL6M4AE卡的时候,驱动要重新装才能使用,怎么解决?
  • ¥15 让node服务器有自动加载文件的功能
  • ¥15 jmeter脚本回放有的是对的有的是错的