ASP.NET MVC母版页中的消息控件

ASP.NET MVC母版页中的消息控件,asp.net,asp.net-mvc-2,Asp.net,Asp.net Mvc 2,大家好。我是MVC新手,有一个关于如何实现的习惯,并尝试实现一些小事情。这是我在WebForms中使用的方法,但我想将其转换为MVC 我有一个包含CSS的用户控件,它将呈现一条消息。此控件位于母版页中,从ASPX页调用,如下所示: public ActionResult MyAction() { // Do some stuff TempData["message"] = "This is a message."; return View("MyView"); } 伪

大家好。我是MVC新手,有一个关于如何实现的习惯,并尝试实现一些小事情。这是我在WebForms中使用的方法,但我想将其转换为MVC

我有一个包含CSS的用户控件,它将呈现一条消息。此控件位于母版页中,从ASPX页调用,如下所示:

public ActionResult MyAction()
{
    // Do some stuff

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

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.MessageMode=WebPageMessageMode.OK;
Msg.ShowOK(“报告已删除”);
}
抓住
{
Msg.MessageMode=WebPageMessageMode.ErrorMessage;
Msg.bathror(“删除报告时出现问题”);
}
Masterpage.aspx
我目前在母版页中拥有控制权,现在我对从这里开始有点困惑

我是否应该将“Msg”对象从伪代码放到母版页的视图中


执行类似操作的正确方法是什么?

在控制器中,作为操作的一部分,您可以设置如下消息:

public ActionResult MyAction()
{
    // Do some stuff

    TempData["message"] = "This is a message.";
    return View("MyView");
}
在母版页或视图中:

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

我认为没有一种解决方案适合所有人

无论如何,这是我使用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; }
}
protected PartialViewResult PartialView( string viewName, object model, string resultHeader ) {
    Response.AppendHeader( "MyHttpCustomHeader", resultHeader );
    return base.PartialView( viewName, model );
}
2)在共享文件夹中创建名为
MyResult
的局部视图以处理模型

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

<div id="resultTitle"><%: Model.Title %></div>
<div id="resultMessage"><%: Model.Message %></div>
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插件来显示您的消息
如果您想检查它是否是一条信息/错误消息,只需在
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);
}

希望有帮助

洛伦佐,这真是太棒了!你的帖子给了我一些我以前从未想过的想法。很高兴它有帮助!如果您认为问题已解决,请将其标记为已回答!