重定向至nancyfx帖子

本文关键字:帖子 nancyfx 重定向 | 更新日期: 2023-09-27 18:19:52

使用nancyfx是否可以重定向到另一个带有post数据的方法?

在我的例子中,在用户注册后,我想自动执行登录(我知道还有其他方法可以实现这一点,我可以从Post["/login"]中提取代码,并从这两个方法中调用它,但这是一个普遍的问题,我想知道这是否可能(也许我想重定向到另一个由另一个开发人员维护的模块,我不能只提取代码)。

这就是我想做的(伪代码)

return RedirectToModule<LoginModule>()
           .WithFormsValue("username", model.UserName)
           .WithFormsValue("password", model.Password);

这里是一个有两个模块的例子。

public class LoginModule : NancyModule
{
    public LoginModule()
    {
        Get["/login"] = _ => {
            return View["login"]; // return login view
        }
        Post["/login"] = _=> {
            // 1. get model
            var model = this.Bind<LoginViewModel>();
            // 2. perform login
            // ...
            // 3. redirect to home
            return Response.AsRedirect("~/");            
        };
    }
}    
public class RegisterModule : NancyModule
{
    public RegisterModule()
    {
        Get["/register"] = _=> {
            return View["register"]; // return register view
        };
        Post["/register"] = _ => {
              // 1. get model
              var model = this.Bind<RegisterModel>();
              // 2. create new User
              // ...
              // 3. redirect To /login with post data (pseudocode)
              return RedirectToModule<LoginModule>()
                 .WithFormsValue("username", model.UserName)
                 .WithFormsValue("password", model.Password);
        };
    }
}

重定向至nancyfx帖子

您应该能够使用307 temporary redirect来实现这一点,但要做到这一点您必须"手动"设置重定向响应:

public class RegisterModule : NancyModule
{
    public RegisterModule()
    {
        Get["/register"] = _=> {
          return View["register"]; // return register view
        };
        Post["/register"] = _ => {
          // 1. get model
          var model = this.Bind<RegisterModel>();
          // 2. create new User
          // ...
          // 3. redirect To /login with post data (pseudocode)
          return 
              Negotiate
              .WithStatusCode(HttpStatusCode.TemporaryRedirect)
              .WithHeader("Location", "/login");
      };
   }
}

这告诉客户端使用相同的HTTP方法和相同的主体(包括表单值)将请求重新提交到Location标头中指示的URL。

如果你愿意,你可以在Negotiator上创建一个扩展,一次完成这个响应:

public Negotiator WithTemporaryRedirect(this Negotiator self, string location) =>
      self.Negotiate
          .WithStatusCode(HttpStatusCode.TemporaryRedirect)
          .WithHeader("Location", "/login");