使用ASP.NET MVC在主页中进行消息控制

时间:2010-11-25 00:07:04

标签: asp.net asp.net-mvc-2

嘿大家好得到了一个关于如何做到这一点的习惯,因为我是MVC的新手,并尝试实现一些小事。这是我在WebForms中执行此操作的方式,但希望将其转换为MVC。

我有一个包含CSS的用户控件,它将呈现一条消息。此控件位于MasterPage中,并从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" />

我目前在MasterPage中拥有控件,现在对于从这里进行操作感到有些困惑。

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

做某事的正确方法是什么?

3 个答案:

答案 0 :(得分: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来显示您的消息

如果你想查看它是一个信息/错误消息,只需在else分支中使用jQuery检查自定义标题

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);
}

希望它有所帮助!

答案 1 :(得分: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);
%>

答案 2 :(得分:0)

阅读this blog post,了解如何在rails风格的asp.net mvc中添加消息: