2013-03-21 70 views
0

我相信我知道我遇到的問題;我只是不知道如何解決它。我的視圖控制器有兩個參數。當它第一次加載它會得到一個參數並加載部分模型。只要從頁面上的網格中進行選擇,就會再次調用控制器方法,並使用這兩個參數加載模型並返回到視圖。重新加載查看模型變化

這一切都很完美,但是當附加數據添加到模型中時,它不會顯示在屏幕上。當我在調試中運行它時,我在視圖中看到數據,它只是不顯示在屏幕上。

我的猜測是,這是因爲我需要重新加載頁面,但我不完全確定如何做到這一點。另外,如果任何人都可以發表評論,並讓我知道我用來完成附加數據加載的工作流是否正確,或者如果有更好的方法。

謝謝!

EventsController

public class EventsController : Controller 
{ 
    // 
    // GET: /Events/ 
    public ActionResult Events(string sName, int? iID) 
    { 
     ViewBag.AppName = sName; 
     EventReader ereader = new EventReader(sName); 
     Events _events = new Events(); 
     _events.LoggedEvents = ereader.GetListOfEvents().ToDataTable(); 
     //_events.EventDetails.Severity = "TEST"; 
     if (iID != null) 
     { 
      _events.EventDetails = ereader.GetEvent((int)iID); 
     } 

     return View(_events); 
    } 

    public ActionResult Read([DataSourceRequest] DataSourceRequest request, string sLogName) 
    { 
     EventReader ereader = new EventReader(sLogName); 
     return this.Json(ereader.GetListOfEvents().ToDataTable().ToDataSourceResult(request)); 
    } 
} 

Events.cshtml

@model Models.Events 

@{ 
    Layout = "~/Views/Shared/_Layout.cshtml"; 
} 

<h2>Events for @ViewBag.AppName</h2> 

<!-- HEADER GRID --> 
<div id="Events"> 
    @(Html.Kendo().Grid(Model.LoggedEvents) 
      .Name("EventGrid") 
      .Events(events => events.Change("eventGridHandler")) 
      .Columns(columns => 
         { 
          columns.Bound("EntryType"); 
          columns.Bound("EventDate"); 
          columns.Bound("Source"); 
          columns.Bound("ID"); 
          //foreach (System.Data.DataColumn column in Model.Columns) 
          //{ 
          // columns.Bound(column.ColumnName); 
          //} 
         }) 
      .Pageable() 
      .Sortable() 
      .Selectable(select => select 
            .Enabled(true) 
            .Mode(GridSelectionMode.Single) 
            .Type(GridSelectionType.Row) 
     ) 
      .DataSource(dataSource => dataSource 
             .Ajax() 
             .Model(model => 
                { 
                 model.Field("EntryType", typeof(string)); 
                 model.Field("EventDate", typeof(DateTime)); 
                 model.Field("Source", typeof(string)); 
                 model.Field("ID", typeof (int));             
                 model.Id("ID"); 
                 //foreach (System.Data.DataColumn column in Model.Columns) 
                 //{ 
                 // model.Field(column.ColumnName, column.DataType); 
                 //}     
                }) 
             .Read(read => read.Action("Read", "Events") 
                  .Data("eventGridBindingData") 
             ) 
     )) 
</div> 

<!-- DETAIL AREA --> 

<div id="EventDetail"> 
    <div id="Data"> 
     @(Html.TextArea("EventData", Model.EventDetails.EventData)) 
    </div> 
    <div id="Details"> 
     <!-- Detail Table Goes Here --> 
     <table> 
      <tr> 
       <td>User</td> 
       <td>Location</td> 
       <td>Severity</td> 
      </tr> 
      <tr> 
       <td>@(Model.EventDetails.UserID)</td> 
       <td>@(Model.EventDetails.LocationID)</td> 
       <td>@(Model.EventDetails.Severity)</td> 
      </tr> 
     </table> 
    </div> 
</div> 

<!-- Page Scripts --> 
<script type="text/javascript"> 

    // Return additional data to the reader 
    function eventGridBindingData() { 
     return { 
      name: '@ViewBag.AppName' 
     }; 
    } 

    // Handler for the EventGrid 
    function eventGridHandler(e) { 
     var data = this.dataItem(this.select()); 
     var appName = '@ViewBag.AppName'; 
     console.log("in event"); 
     jQuery.ajax({ 
      url: 'Events', 
      data: { 'sName' : appName, 'iID' : data.id }, 
      type: "POST", 
      cache: false 
     }); 
    } 

</script> 

Events.cs(模型)

public class Events 
{ 
    #region PROPERTIES 

    public DataTable LoggedEvents { get; set; } 
    public CEventMessage EventDetails { get; set; } 

    #endregion 

    #region CONSTRUCTORS 

    public Events() 
    { 
     LoggedEvents = new DataTable(); 
     EventDetails = new CEventMessage(); 
    } 

    #endregion 
} 

回答

0

註冊回答你的第二個問題,即這是否是解決問題的「正確」方式,我可能不會說。

我寧願使用單獨的操作方法'EventDetails'來傳遞給定事件ID的詳細信息。這將防止整個頁面在用戶真正想要查看給定事件的細節時被刷新。 (更不用說不必要的後端聊天)

處理細節的視圖也可以是Kendo網格,您可以使用Kendo客戶端綁定javascript將返回的事件詳細信息(在JSON中)綁定到詳細網格。

爲了理解我在談論的內容,請參考這個blog(我已經爲Telerik ASP.Net-MVC網格編寫了這個網格,他們在這個網格中嵌入了「主細節」。不知道劍道是否支持開箱即用)