我有一个ViewBag字符串消息。 此消息从操作链接传递到控制方法。然后可以基于viewbag消息在action方法中使用某些逻辑。
同样,操作结果可以设置视图包消息,这样当加载视图页面时,jquery会比较viewbag消息,如果有任何匹配,则会显示一个toast消息。
< / LI>这要求我控制程序的流程。所以我知道哪个方法将处理actionlink。
问题是,使用实体框架的用户身份。如果该方法被授权阻止,则会自动绕过该方法,并向用户显示登录页面。
这意味着,我的剃刀没有将任何信息传递给该特定方法。
ActionLink有viewbag消息 - &gt;作为参数传递给控制器
控制器设置消息 - &gt;加载页面时,会检查邮件。
我一直在将string ViewBag.Message
从视图传递给控制器,使用toastr
在整个项目中创建弹出窗口。效果很好。
当用户想要结帐时,我有一个项目使用内置[Authorize]
中的UserIdentity
。
[Authorize]
public ActionResult Checkout(string message)
{
问题是,消息永远不会传递给LoginAction
方法。
[AllowAnonymous]
public ActionResult Login(string message,string returnUrl)
{
我尝试在视图中创建消息。
@{
string message = ViewBag.Message;
}
/.../
@Html.ActionLink("Go To Check Out", "Checkout", "Carts",
new {message = "You Need to Login to Checkout!" })
如果我可以确定使用哪个链接来调用Login视图,我已经尝试过了。我一直在打开和关闭它。
修改
工作原理:
[HttpPost]
public ActionResult RemoveFromCart(int prod_id)
{
Cart cart = (Cart)Session["Cart"];
cart.RemoveFromCart(prod_id);
return RedirectToAction("Index", new { message = "Cart Updated!" });
}
使用索引:
@section Scripts {
<script src="~/Scripts/jquery-2.1.4.js"></script>
<link href="~/Content/toastr.css" rel="stylesheet" />
<script src="~/Scripts/toastr.js"></script>
<script src="~/Scripts/toastr.min.js"></script>
<script type="text/javascript">
$(document).ready(function () {
if ('@ViewBag.Message' == "Cart Updated!") {
toastr.options.timeOut = 1500; // 1.5s
toastr.success('@ViewBag.Message');
}
if ('@ViewBag.Message' == "Login Successful!") {
toastr.options.timeOut = 1500; // 1.5s
toastr.success('@ViewBag.Message');
}
if ('@ViewBag.Message' == "Registration Successful!") {
toastr.options.timeOut = 1500; // 1.5s
toastr.success('@ViewBag.Message');
}
});
</script>
}
实际上,实际上viewbag消息是在控制器中设置的,然后在页面加载时比较(在jquery中)消息。
所以我想把它做到前面,因为我知道如何做到这一点。
所以我想检查一下帐户/登录控制器,我需要检查登录是否来自试图在没有登录的情况下结账的用户,因为它只是使用[授权]安全性重定向到那里检查,我不知道如何做到这一点。
[AllowAnonymous]
public ActionResult Login(string message,string returnUrl)
{
if (message == null)
{
message = "";
}
// Algorithm - IF this was redirected from an attempt to checkout without being logged in. Have the view bag message =="You Need to Login to Checkout!"
ViewBag.ReturnUrl = returnUrl;
return View();
}
这样,当加载“登录”页面时,将会有一个Toast消息,因为在加载每个页面时都会检查该消息。
编辑402,128,841,442,222 ,仍然不是维基;)
以下解释了这个问题。
ViewBag&amp; amp;的相似之处ViewData的:
帮助您在从控制器移动到视图时保持数据 习惯了 将数据从控制器传递到相应的视图 寿命短意味着 重定向发生时,value变为null 这是因为他们的目标 是提供一种在控制器和视图之间进行通信的方法。它的 服务器调用中的通信机制。
所以我想我需要找到另一种做法,欢迎任何想法。
答案 0 :(得分:1)
如果您尝试将属性作为GET参数传递给您的操作,则使用的是@Html.ActionLink
的错误版本。
此方法有大约一百五十万次覆盖。您将new message = { "blah" }
传递给HtmlAttributes
- 这些将在<a>
标记上显示为html属性。您需要使用此覆盖:
@Html.ActionLink("Go To Check Out", "Checkout", "Carts", new { @class ="cssClass-for-link"}, new { message ="You Need to Login to Checkout!"})
答案 1 :(得分:0)
我通过删除注释[Authorize]
解决了这个问题,并检查了用户是否已登录,如果用户未登录,则将重定向信息发送到登录页面。
// [Authorize]
public ActionResult Checkout(string message)
{
if(message==null)
{
message = "";
}
ViewBag.Message = message;
if (!User.Identity.IsAuthenticated) {
return RedirectToAction("Login","Account", new { message = "You Need to Login to Checkout!" });
}
/.../