0

私は自分が抱えている問題を認識していると信じています。解決方法がわかりません。私のビューコントローラーは2つのパラメーターを取ります。最初にロードされると、1つのパラメーターを取得し、部分モデルをロードします。ページ上のグリッドから選択が行われるとすぐに、コントローラーメソッドが再度呼び出され、モデルに両方のパラメーターが読み込まれ、ビューに戻ります。

これはすべて完全に機能しますが、モデルに追加データが追加されると、画面に表示されません。デバッグで実行すると、ビューにデータが表示されますが、画面に表示されません。

これは、ページをリロードする必要があるためだと思いますが、その方法が完全にはわかりません。また、誰かがコメントして、追加データのロードを実行するために使用しているワークフローが正しいかどうか、またはより良い方法があるかどうかを知らせてくれたら。

ありがとう!

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
}
4

1 に答える 1

0

Regarding your second question of whether this is the 'correct' way to go about solving the problem, I'd say probably not.

I'd rather use a separate action method 'EventDetails' to deliver the details of a given event Id. This will prevent the whole page being refreshed when the user actually wants to see the details of a given event. (Not to mention the unnecessary back-end chatter)

The view handling the details can also be a Kendo grid and you can use Kendo client side binding javascript to bind the returned event details (In JSON) to the detail grid.

To get a conceptual understanding of what I'm talking about please refer this blog (I've written this for Telerik ASP.Net-MVC grid where they have the 'master-detail' baked in to the framework. Don't know whether Kendo supports this out of the box yet)

于 2013-03-22T03:11:27.563 に答える