重定向至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);
};
}
}
您应该能够使用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");