2010-11-25 10 views
2

Hey alle. Ich habe einen Brauch, wie man das als MVC-Neuling macht und versucht, ein paar kleine Dinge zu implementieren. So habe ich es in WebForms gemacht, möchte es aber in MVC umwandeln.Nachrichtensteuerung in Masterpage mit ASP.NET MVC

Ich habe ein Benutzersteuerelement, das CSS enthält, das eine Nachricht rendern wird. Diese Steuerung wird in der Masterpage befindet und von einer ASPX-Seite wie folgt aufgerufen:

Pseudo-Code:

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" /> 

ich zur Zeit die Kontrolle in der Masterpage habe und jetzt ein wenig verwirrt darüber, ausgehend von hier im.

Sollte ich das "Msg" -Objekt oben aus dem Pseudocode auf eine Ansicht von der MasterPage setzen?

Was ist der richtige Weg, etwas zu tun?

Antwort

0

In einem Controller, als Teil der Aktion, eine Meldung wie folgt einstellen:

public ActionResult MyAction() 
{ 
    // Do some stuff 

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

In der Masterseite oder in der Ansicht:

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

Ich glaube nicht, dass es Ein One-Lösung-passt für alle hier.

Wie auch immer das ist meine Lösung, die jQuery verwendet:

1) eine MyResultModel Klasse Erstellen Sie eine Nachricht an den Benutzer

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) Erstellen Sie eine Teilansicht in dem Namen MyResult zu handhaben Gemeinsam genutzte Ordner zu handhaben das Modell

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

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

3) Erstellen und verwenden Sie einen BaseController für Ihre Controller und fügen Sie die folgende Methode hinzu. Das Verfahren einfach einen benutzerdefinierten HTTP-Header der Antwort hinzufügen

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

4) In Ihrer Aktion eine MyResultView zurück, wenn Sie schließlich

[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) getan haben, Senden Sie das Formular mit jquery und handle mit den Ergebnissen.

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

Mit einem Szenario wie diesem müssen Sie kein Steuerelement auf der Masterseite platzieren.Sie können:

  • Zeigen Sie die Ansicht, wie sie von der Aktion ohne Änderung
  • Verwenden einig Phantasien Nachricht Display-Technik kommen wie Stackoverflow hat mit der orangefarbenen Schiebe Nachricht (in diesem Fall einfach den Titel extrahiert und die Nachricht aus die zurück html)
  • einige ausgefallene jQuery-Plugin als jGrowl Verwenden Sie Ihre Nachricht

zu zeigen Wenn Sie, ob es überprüfen wollen, eine Info/Fehlermeldung den benutzerdefinierten Header mit jQuery in der else Zweig einfach überprüfen

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

Hoffe es hilft!

+0

Das ist great stuff Lorenzo! Dein Beitrag hat mir einige Ideen gegeben, über die ich vorher noch nicht nachgedacht habe. – Todd

+1

Froh, dass es geholfen hat! Bitte markieren Sie die Frage als beantwortet, wenn Sie das Gefühl haben, dass es getan ist! – Lorenzo

0

lesen this blog post wie Nachricht in asp.net MVC in Schienen Stil hinzuzufügen: