2013-03-21 48 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网格编写了这个网格,他们在这个网格中嵌入了“主细节”。不知道剑道是否支持开箱即用)