2010-11-25 57 views
2

嘿,大家好。有一个关于如何做到这一点的习惯,即时通讯新的MVC,并试图实现一些小事情。这是我在WebForms中完成它的方式,但希望将其转换为MVC。使用ASP.NET MVC控制主页中的消息控制

我有一个用户控件包含将呈现消息的CSS。这种控制位于母版,并呼吁从一个ASPX页面是这样的:

伪代码:

try{ 
    Msg.MessageMode = WebPageMessageMode.OK; 
    Msg.ShowOK("Report deleted."); 
} 
catch 
{ 
Msg.MessageMode = WebPageMessageMode.ErrorMessage; 
Msg.ShowError("There was a problem deleting the report."); 
} 

Masterpage.aspx 
<cc1:WebPageMessage runat="server" ID="msg" /> 

我目前在母版控制和现在即时通讯有点困惑从这里出发。

我应该把上面的'Msg'对象从伪代码放到MasterPage的View中吗?

什么是正确的方式来做类似的事情?

回答

0

在一个控制器,作为行动的一部分,你可以设置这样一条消息:

public ActionResult MyAction() 
{ 
    // Do some stuff 

    TempData["message"] = "This is a message."; 
    return View("MyView"); 
} 

在你的母版页或在您的视图:

<% 
    string text = TempData["Message"] as string;  
    Response.Write(text); 
%> 
3

我不认为有在这里一个解决方案。

反正这是我的解决方案,它使用jQuery的:

1)创建一个MyResultModel类来处理一个消息给用户

public enum MyResultType { Info, Error } 

public class MyResultModel 
{ 
    public MyResultModel(MyResultType type, string message) { 
     switch (type) { 
      case MyResultType.Info: Title = "OK"; break; 
      case MyResultType.Error: Title = "Error!!!"; break; 
     } 
     Message = message; 
    } 
    public String Title { get; set; } 
    public String Message { get; set; } 
} 

2)创建命名MyResult的局部视图共享文件夹来处理模型

<%@ Control Language="C#" Inherits="System.Web.Mvc.ViewUserControl<MyResultModel>" %> 

<div id="resultTitle"><%: Model.Title %></div> 
<div id="resultMessage"><%: Model.Message %></div> 

3)为您的控制器创建并使用BaseController,并向其中添加以下方法。这个方法简单地自定义HTTP标头添加到响应

protected PartialViewResult PartialView(string viewName, object model, string resultHeader) { 
    Response.AppendHeader("MyHttpCustomHeader", resultHeader); 
    return base.PartialView(viewName, model); 
} 

4)在你的行动返回MyResultView当你做了

[HttpPost] 
public virtual ActionResult DoSomething() { 
    try { 
     //Do Something 
     return PartialView("MyResult", 
          new MyResultModel(MyResultType.Info, "Operation Completed"), 
          "HttpResultInfo"); 
    } 
    catch (Exception ex) { 
     return PartialView("MyResult", 
          new MyResultModel(MyResultType.Error, ex.Message), 
          "HttpResultError"); 
    } 
} 

5)最后,使用jQuery提交表单并处理结果。

$.ajax({ 
    type: "post", 
    dataType: "html", 
    url: "your/url/here", 
    data: $("#myform").serialize(), 
    success: function (response, status, xml) { 
     var resultType = xml.getResponseHeader("MyHttpCustomHeader"); 
     if (resultType == null) { 
      //No message do whatever you need 
     } 
     else { 
      //response contain your HTML partial view here. Choose your 
      //desidered way to display it 
     } 
    } 
}); 

对于这样的场景,您不需要在母版页上放置一个控件。您可以:

  • 显示视图,因为它来自于行动没有任何修饰
  • 使用一些花哨的消息显示技术如StackOverflow上确实有橙色的滑动消息(在这种情况下,简单的提取标题,并从消息返回的HTML)
  • 使用一些花哨的jQuery插件为jGrowl显示您的消息

如果你想请检查是否它是一个信息/错误消息只需检查与jQuery自定义标题在else分支

var title = $(response).filter("#resultTitle").text(); 
var message = $(response).filter("#resultMessage").text(); 
if (resultType == "HttpResultInfo") { 
    showInfoMessage(title, message); 
} 
else if (resultType == "HttpResultError") { 
    showErrorMessage(title, message); 
} 

希望它有帮助!

+0

这就是伟大的东西洛伦佐!你的帖子给了我一些我以前没有想过的想法。 – Todd 2010-11-25 03:57:27