使用重定向方法将数据从控制器传递到视图

Pass data from controller to View with redirect method

我有一个用 C# 编写的 ASP.Net Web 应用程序,我想在其中的 report.cshtml 视图中显示一些可视化图表。
目前,我正在使用 report.cshtml 视图的 httpget 函数将数据传递到我的视图。但是用这种方法,我无法过滤数据。所以这就是我想要做的:

当用户连接到我的网站时,它会在我的 HomeController 中启动我的 Httppost 函数,并将用户名和密码作为参数。
我使用此功能通过 response.redirect 方法重定向到我的 report.cshtml 视图,在该视图中用户应将其个人数据作为可视化。

我的数据库本地存储在一个名为 my_list 的变量中,我可以在我的 httppost 函数中使用它。

我想要的是将此列表传递到我的 [=39] 的 js 部分=] 当重定向发生时。 这可以通过使用重定向方法实现吗?
或者,如果不能,是否有其他解决方案?

我的 Index.cshtml :


<form method="post" , enctype="multipart/form-data">

            <input required id="my_pseudo" name="my_pseudo" v-model="pseudo" placeholder="Username" />
            <input required id="my_password" name="my_password" type="password" v-model="password" placeholder="password" />

            <Button id="test_click" Text="Connexion">Connection</Button>

        </form>

我的 httpget 函数:

public ActionResult EmbedReport()
        {

            List<Dashboard___Veins_Data___By_Institution> my_list = fct_BO.Class1.My_function("my_user");
            // It's at this moment that the filter is applied, so I want that, instead of "my_user", I can put a variable which is the "Contact_name" of the user currently connected.
            ViewBag.Message = my_list;


            return View();
        }

我的 httppost 函数

public ActionResult Index(string my_pseudo, string my_password)
        {
            
            
            
            //It's not good for the moment, but it's here that I want to see if "my_pseudo" and "my_password" match a line of my table "User_connection". If yes, the redirect method occurs and I would like to past my list at the same time ->

             if (...)
                  Response.Redirect("~/Home/Report");
                  

            // If not, then the user will receive an error message.
             else
                Response.Write("<script>alert('Login or password incorrect')</script>");

            return View();
            
        }

我没有完成这个功能,因为我的数据库中的table“User_connection”暂时没有完成。

此外,有人建议我使用 RedirectResult 而不是 response.redirect。这是更好的解决方案吗?

谢谢。

我可以建议你将你的行为包装在接口中吗?

这样你就有了一个界面

public interface IErrorHandler {
   void provideErrorResponse(HttpResponse response);
}

public interface ISuccessHandler {
   void provideSuccessfulResponse(HttpResponse response);
}

因为现在你可以实现小的单一目的 类 以某种方式处理正确或不正确的响应,这意味着如果你需要以相同的方式错误处理多个结果(非常可能)你可以简单地依赖项也将错误处理程序注入到您的其他控制器中,并且只有一组接口测试,而不是一套测试来测试每个控制器上的相同行为。

最后一个问题:

"

Response.Redirect("http://www.microsoft.com/gohere/look.htm");

调用Redirect相当于调用第二个参数为true的Redirect

Redirect 调用 End,它在完成时抛出 ThreadAbortException 异常。此异常对 Web 应用程序性能有不利影响。因此,我们建议您不要使用此重载,而是使用 HttpResponse.Redirect(String, Boolean) 重载并为 endResponse 参数传递 false,然后调用 CompleteRequest 方法。有关详细信息,请参阅 End 方法。"

摘自: https://docs.microsoft.com/en-us/dotnet/api/system.web.httpresponse.redirect?view=netframework-4.8

这可能就是他建议您不要使用它的原因。但这是一个完全的猜测,因为我不知道当时“某人”指的是什么:)

举个例子:

public class HomeController {
   private IErrorHandler _errorHandler;
   private ISuccessHandler _successHandler; 

   public class HomeController (IErrorHandler errorHandler, ISuccessHandler successHandler)
   {
      _errorHandler = errorHandler;
      _successHandler = successHandler;
   }

   public ActionResult Index(string my_pseudom, string my_password)
   {
      if (...)
         _successHandler.provideSuccessfulResponse(Response);
                  
      // If not, then the user will receive an error message.
      else
         _errorHandler.provideErrorResponse(Response));
   }

}

请注意,您甚至可以 re-use 成功响应,前提是它们在处理成功响应的方式上没有区别(不太可能)

为了“过滤”您的视图,通常通过 end-point 到 back-end 将一组参数从您的视图传递到控制器,然后再传递到 back-end,然后是生成的项目列表,将在 back-end 处过滤并作为响应返回。

所以当你说你希望通过 re-direct 完成此操作时,我不确定我是否完全按照你的意图去做?

是这样的吗?

public interface ILoginHandler {
   ILoginResult HandleLogin(string username, string password); 
}

public inteface ILoginResult {
   bool WasValid {get;set;}
}

public class HomeController {
       private IErrorHandler _errorHandler;
       private ISuccessHandler _successHandler; 
       private ILoginHandler _loginHandler;
    
       public class HomeController(IErrorHandler errorHandler, ISuccessHandler successHandler, ILoginHandler loginHandler)
       {
          _errorHandler = errorHandler;
          _successHandler = successHandler;
          _loginHandler = loginHandler;
       }
    
       public ActionResult Index(string my_pseudom, string my_password)
       {    
          ILoginResult loginResult = _loginHandler.HandleLogin(my_pseudom, my_password);
          if (loginResult.WasValid)
             _successHandler.provideSuccessfulResponse(Response);
          else
             _errorHandler.provideErrorResponse(Response));
       }
    
    }

根据谁登录,你可以制作一个工厂模式,它采用用户名,然后向你的 back-end 和 returns 提供一个特定的请求,如果你想要的话过滤,将过滤值作为 URL 的一部分提供,或者将其设为 post,以便您可以那样提供参数。

然后更新您的工厂以也使用这些参数。应该不是问题。