使用nancyfx是否可以使用帖子数据重定向到另一种方法?
在我的示例中,在用户注册后我想自动执行登录(我知道还有其他方法可以实现这一点,我可以从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);
};
}
}
答案 0 :(得分:0)
您应该可以使用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");