如何将错误消息显示回ASP.NET MVC页面?

时间:2009-10-18 13:02:00

标签: jquery asp.net-mvc statusbar

请注意StackOverflow如何根据您的活动显示一些不错的状态栏消息? (在首页的橙色酒吧)我希望做同样的事情,但我不确定如何。

现在我知道如何使用ASP.NET MVC 1.0向UI显示验证错误......这并不太难。但是,如果我想显示一个状态栏thingy(不确定它们被称为什么),我猜他们已经完成了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 });
}

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

喝彩!

1 个答案:

答案 0 :(得分:3)

有几种方法:

  1. 将它放到TempData [“statusmsg”]并从您的动作或视图中选择它。缺点:如果用户没有点击它并重新加载页面,则不会再次显示。
  2. 把它放到Session。只有当用户点击状态链接时,您才会将其从会话中删除。
  3. 您可以直接访问TempData / Session,也可以让BaseController具有StatusMsg属性和相关内容,或者您​​可以让BaseViewModel(所有操作的视图模型的基类)包含此StatusMsg属性。

    对于状态栏jQuery,您可以轻松地从谷歌中选择一个,例如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>
    

    好的,还有更多。您的div为id =“msg”和

      #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分钟内完成,那么你只能希望有人会采取时间提供完整的工作测试解决方案......并且不会为此收费; - )