使用重定向方法将数据从控制器传递到视图
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,以便您可以那样提供参数。
然后更新您的工厂以也使用这些参数。应该不是问题。
我有一个用 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,以便您可以那样提供参数。
然后更新您的工厂以也使用这些参数。应该不是问题。