2013-03-25 6 views
5

Ich versuche TempData in Javascript zuzugreifen. aber Nullwert erhalten. Ich mache einen Ajax-Anruf, um den Datensatz zu aktualisieren, und ich möchte die Nachricht Rekord erfolgreich aktualisiert anzeigen. Das kommt von UpdateOperation Aktion von der Steuerung. , aber derzeit wird Nullwert angezeigt. Ich überprüfe auch mit Firebug zeigt es wie folgt:Zugriff tempdata in Javascript in mvc4

function onComplete(e) { 

if (e.name == "update") { 

alert(''); 

} 

Hier ist mein Code der Controller

public class OperationController : BaseController 
    { 
     /// <summary> 
     /// Index action will return template view of the page without data 
     /// </summary> 
     /// <returns>Blank Action</returns> 
     public ActionResult Index() 
     { 
      return this.View(); 
     } 

     /// <summary> 
     /// Get all Operation from System 
     /// </summary> 
     /// <returns>return action result</returns> 
     [GridAction] 
     public ActionResult SelectOperation() 
     { 
      IEnumerable<OperationEntity> operationList = OperationComponent.GetAll(); 
      return this.View(new GridModel(operationList)); 
     } 

     /// <summary> 
     /// Method for update operation 
     /// </summary> 
     /// <param name="entity">moduleViewModel to update Module</param> 
     /// <returns>return action result</returns> 
     [GridAction] 
     public ActionResult UpdateOperation(OperationEntity entity) 
     { 
      if (ModelState.IsValid) 
      { 
       entity.Log = new BusinessCore.BusinessEntities.LogDetails(); 
       entity.Log.ModifiedBy = SessionHelper.UserId; 
       Status status = OperationComponent.Update(entity); 
       this.TempData["AlertMessage"] = status.Message; 
       this.ViewData["_AlertMessage"] = status.Message; 
       return this.View(new GridModel(OperationComponent.GetAll())); 
      } 
      else 
      { 
       return this.View(entity); 
      } 
     } 
    } 

Meiner Ansicht

@using Telerik.Web.Mvc.UI; 
@{ 
    ViewBag.Title = "Operation List"; 
} 

<h2>@ViewBag.Title</h2> 
<script src="../../../../Scripts/jquery-1.7.1.min.js" type="text/javascript"></script> 
<script type="text/javascript"> 
// function onSave(e) { 
//  alert('Record Save Succesfully'); 
// } 
    function onComplete(e) { 
     if (e.name == "update") { 
      alert('@TempData["AlertMessage"]'); 
      alert('@ViewData["_AlertMessage"]'); 
     } 
     if (e.name == "insert") { 
      alert("Operation Inserted Successfully"); 
     } 
     if (e.name == "delete") { 
      alert("Operation Deleted Successfully"); 
     } 
    } 
    function newAlert(type, message) { 
    if (message != "" || message != null) { 
     $("#alert-area").append($("<div class='alert alert-success " + type + " fade in' data-alert><p><b> " + message + " </b></p></div>")); 
     $(".alert-success").delay(4000).fadeOut("slow", function() { $(this).remove(); }); 
    } 
} 
</script> 

@(Html.Telerik().Grid<QuexstERP.BusinessCore.BusinessEntities.SysAdmin.OperationEntity>() 
     .Name("Grid") 
     .DataKeys(keys => 
     { 
      keys.Add(p => p.Id); 
     }) 
        .ToolBar(commands => commands.Insert().ButtonType(GridButtonType.Image).ImageHtmlAttributes(new { style = "margin-left:0", title = "Add" })) 
     .DataBinding(dataBinding => 
     { 
      dataBinding.Ajax() 
       .Select("SelectOperation", "Operation") 
       .Insert("InsertOperation", "Operation") 
       .Update("UpdateOperation", "Operation") 
       .Delete("DeleteOperation", "Operation"); 
     }) 
     .Columns(columns => 
     { 
      columns.Command(commands => 
      { 
       commands.Edit().ButtonType(GridButtonType.Image).HtmlAttributes(new { title = "Edit" }); 
       commands.Delete().ButtonType(GridButtonType.Image).HtmlAttributes(new { title = "Delete" }); 
      }).Width(80).Title("Commands"); 
      columns.Bound(p => p.Name).Width(200).Title("Operation Name"); 
      columns.Bound(p => p.Description).Width(310).Title("Description"); 
     }) 
     .ClientEvents(events => events 
       .OnComplete("onComplete") 
       ) 
        .Editable(editing => editing.Mode(GridEditMode.PopUp).InsertRowPosition(GridInsertRowPosition.Top)) 

     .Pageable() 
     .Scrollable() 
     .Sortable() 
     .Filterable()   
) 
@section HeadContent { 
<style type="text/css"> 
    .field-validation-error 
    { 
     position: absolute; 
     display: block; 
    } 

    * html .field-validation-error { position: relative; } 
    *+html .field-validation-error { position: relative; } 

    .field-validation-error span 
    { 
     position: relative; 
     white-space: nowrap; 
     color: red; 
     padding: 10px 5px 3px; 
     background: transparent url('@Url.Content("~/Content/Common/validation-error-message.png") ') no-repeat 0 0; 
    } 

    /* in-form editing */ 
    .t-edit-form-container 
    { 
     width: 480px; 
     margin: 1em; 
    } 

    .t-edit-form-container .editor-label, 
    .t-edit-form-container .editor-field 
    { 
     padding-bottom: 1em; 
     float: left; 
    } 

    .t-edit-form-container .editor-label 
    { 
     width: 25%; 
     text-align: right; 
     padding-right: 3%; 
     clear: left; 
    } 
    .t-edit-form-container .editor-field textarea 
    { 
    font-size:11px; 
    width:80%; 
} 
    .t-edit-form-container .editor-field 
    { 
     width: 70%; 
    } 
</style> 
} 
+0

versuchen Sie ein 'Debugger;' in Ihrer if-Anweisung, die e.name == "update" bekommt und überprüfen, ob es an den Debugger kommt oder nicht –

+0

yap ich bereits getan, dass es kommt aber alert ('') ; value ist null, da ich AJAX Anruf zum Server mache. Es wird Calue in Tempdata, aber es ist nicht erfrischender Wert von Javascript –

Antwort

13

Ich weiß, ihr eine alte Frage, aber ich dachte, ich würde antworten, wie ich war auf der Suche für genau die gleiche Lösung und hoffentlich anderen zu helfen.

Dies löste es für mich how-to-get-the-tempdata-in-javascript

Wesentlichen Ihre Syntax fehlt Klammern

//Your code 
alert('@TempData["AlertMessage"]'); 

// Correct code 
alert('@(TempData["AlertMessage"])'); 

Die Halterung nach dem @

hoffe, das hilft den nächsten Sucher wie ich.

2

TempData verwendet, wenn auf Aktion umleiten. Versuchen Sie ViewBag.

In Controller:

ViewBag.AlertMessage = status.Message; 

In Ansicht:

@{ 
    ViewBag.Title = "Operation List"; 
    string alert = "Your custom error message"; 

    if(ViewBag.AlertMessage != null) 
    { 
     alert = (string)ViewBag.AlertMessage; 
    }   
} 

und Javascript

var jsAlert = '@alert'; 
alert(jsAlert); 
+0

Ihre Antwort scheint klug zu sein, aber ich bekomme einen Fehler "Der Name 'Alarm' existiert nicht im aktuellen Kontext". Auf der anderen Seite, mit Html.BeginForm konnte ich Nachrichten von Controller zu View mit TempData oder ViewBag übergeben. Aber mit Ajax kann ich nicht bestehen. Also, Ihre Antwort löst dieses Problem? Oder welche Änderungen sollten angewendet werden? Danke im Voraus. –

+0

Sie erhalten diesen Fehler ("Der Name 'alert' existiert nicht im aktuellen Kontext"), da die 'alert' Variable in derselben Seite mit js code und top of view sein sollte. Zweitens, möchten Sie Daten vom Controller zur Ansicht oder von der Ansicht zum Controller mit Ajax übergeben? Ich kann nicht gut fragen. –

+0

Ich möchte Daten vom Controller zu View übergeben. Auf der anderen Seite wäre es besser, die notwendigen Variablen in Ihre Antwort einzugeben, so dass die anderen Leute, die nicht genug Erfahrung haben, sie leicht benutzen können. Vielen Dank. –