重定向到nancyfx发布

时间:2015-10-30 14:29:59

标签: c# nancy

使用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);
        };
    }
}

1 个答案:

答案 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");