1

请注意 StackOverflow 如何根据您的活动显示一些漂亮的状态栏消息?(首页上的那个橙色条)我也希望这样做,但我不知道怎么做。

现在我知道如何使用 ASP.NET MVC 1.0 向 UI 显示验证错误......这并不难。但是,如果我想显示一个状态栏(不确定它们叫什么)并且我猜它们是用 jQuery 完成的……你是怎么做到的。

更何况,我也想在我调用另一个动作之后再做

例如。

public ActionResult AuthoriseWithTwitter(string nickname)
{
   // Authorise, etc. etc.
   ....

   // If we have a Twitter OAuth Access token 
   // (ie. we've come BACK from twitter OK)
   // then go back to the Index action, but display a status bar 
   // message saying 'done / thanks / got it / etc..'
   return RedirectToAction("Index", new[] { nickname });
}

我不确定如何将消息传递回该操作,以及如何使用其中一个状态栏显示该消息。

干杯!

4

1 回答 1

3

几种方式:

  1. 将其放入 TempData["statusmsg"] 并在您的操作或视图中从那里选择它。缺点:如果用户没有点击它并重新加载页面,它就不会再次显示。
  2. 把它放到会话中。当用户单击状态链接时,您只会将其从会话中删除。

您可以直接访问 TempData/Session,或者您可以让 BaseController 具有 StatusMsg 属性和相关内容,或者您​​可以让 BaseViewModel(所有操作的视图模型的基类)包含此 StatusMsg 属性。

至于状态栏 jQuery,你可以很容易地从 google 中选择一个,例如http://www.west-wind.com/WebLog/posts/388213.aspxhttp://plugins.jquery.com/project/positionFooter。但是,如果你想将它放在顶部,它会容易得多,只需几行 CSS/jQuery 行:绝对位置在 0:0,宽度 100%,也许设置不透明度,然后当你得到 msg 时就做

<script>
  <% if (Model.StatusMsg != null) %>
    $(function(){ $("#statusbar").fadeIn(); });
  <% } %>
</script>

好的,这里还有更多。你有 id="msg" 的 div 和

  #msg {
    text-align: center;
    position: absolute;
    line-height: 2em;
    left: 0px;
    top: 0px;
    width: 100%;
    display: none;
    opacity: 0.7;
    background-color: #aaf;
    border-bottom: 1px solid black;
  }

您可以使用http://plugins.jquery.com/project/jQueryFixedPositionPlugin修复顶部的元素,使其不会随页面滚动。

现在,每当您收到状态消息时,您都会执行 Session["status"] = "mymessage"。或者,您覆盖 BaseController.OnActionExecuted 并将消息放入 Session 那里(如果它是应用程序范围的)。

然后在你看来你做

<script type="text/javascript">
   function showstatus(text) {
     $("#msg").fadeIn().append("<div>" + text + "</div>");
   }
   $(function(){
      <% if (Session["status"] != null) { %>
         var status = '<%= Session["status"] %>'; 
         showstatus(status);
      <% ; Session.Remove("status"); } %>
   });
</script>

您可以通过在基础 OnActionExecuting 中执行此操作来避免 Session.Remove("status"):

{
  if (Session["status"] != null)
  {
     ViewData["status"] = Session["status"];
     Session.Remove("status");
  }
}

然后在视图中引用 ViewData 而不是 Session。

现在,当然可以做更多的事情,上面的代码是我的头脑,未经测试......但如果这还不足以在 5 分钟内完成,那么你只能希望有人会花时间提供完整的工作测试解决方案......并且不会为此收费;-)

于 2009-10-18T13:22:31.750 回答