-1

やあ; あらゆる種類のソリューションバインディングデータウェブグリッド静的モデル。しかし、私のデータは動的です。言わないでください:なぜDataTableを使用するのですか?

コントローラ:



      [AcceptVerbs(HttpVerbs.Post)]
        public ActionResult Index(string submitButton, FormCollection fc)
        {
            ViewData["Customers"] = new SelectList(CustomerOperation.GetCustomers().Items, "Id", "Name", null);
            ViewData["Jobs"] = new SelectList(JobOperation.GetCustomersAssemblyList().Items, "scheduleId", "name", null);
            int Id = ConvertUtil.ToInt(fc["Customers"]);
            int scheduleId = ConvertUtil.ToInt(fc["Jobs"]);
            DataTable dt = JobOperation.GetJobsBySchedulerIdAndCustomerId(scheduleId, Id);
           return View(Json(dt,JsonRequestBehavior.AllowGet));
        }

意見:


 <% 
     List<WebGridColumn> cols = new List<WebGridColumn>();
     WebGrid grid = null;
     if (Model != null)
     {
           grid = new WebGrid(source: Model.Data, rowsPerPage: 3);
         
         System.Reflection.PropertyInfo[] propertiesofColumn = new System.Reflection.PropertyInfo[] { };
         foreach (object column in Model)
         {
             propertiesofColumn = column.GetType().GetProperties();
         }

         foreach (System.Reflection.PropertyInfo propInfo in propertiesofColumn)
         {
             cols.Add(grid.Column(propInfo.Name, propInfo.Name));
         }

       
     }
     
   using (Html.BeginForm())
      { %>

grid = new WebGrid(source:Model.Data、rowsPerPage:3);でエラーが発生しました。。

エラー:

RunTimeBinderException:'System.Web.Helpers.WebGrid.WebGrid(System.Collections.Generic.IEnumerable、System.Collections.Generic.IEnumerable、string、int、bool、bool、string、string、string、string 、string、string、string)'にいくつかの無効な引数があります

4

1 に答える 1

2

言わないでください:なぜDataTableを使用するのですか?

DataTableの使用に問題はありません。DataTablesは.NETの初期の頃から存在しており、DataTablesに依存する既存のコードがまだたくさんあることは完全に理解できます。しかし、それはそれらのDataTablesがコントローラーからビューまでフロンティアを横断する必要がある理由ではありません。コントローラは常にビューモデルをビューに渡す必要があります。それでは、このビューモデルを定義することから始めましょう。

public class MyViewModel
{
    public int? SelectedCustomerId { get; set; }
    public IEnumerable<SelectListItem> Customers { get; set; }

    public int? SelectedJobId { get; set; }
    public IEnumerable<SelectListItem> Jobs { get; set; }

    public IEnumerable<string> Columns { get; set; }
    public IEnumerable<object> Values { get; set; }
}

また、現在実行している醜い解析を回避するために、リクエストのビューモデルを定義します。

public class RequestViewModel
{
    public string SubmitButton { get; set; }
    public int Customers { get; set; }
    public int Jobs { get; set; }
}

さて、これをどのように隠すのDataTableですか?それを動的オブジェクトに変換する拡張メソッドを書くことができます:

public static class DataTableExtensions
{
    private sealed class Row : DynamicObject
    {
        private readonly DataRow _row;
        public Row(DataRow row) 
        { 
            _row = row; 
        }

        public override bool TryGetMember(GetMemberBinder binder, out object result)
        {
            var value = _row.Table.Columns.Contains(binder.Name);
            result = value ? _row[binder.Name] : null;
            return value;
        }
    }

    public static IEnumerable<dynamic> AsDynamicEnumerable(this DataTable table)
    {
        return table.AsEnumerable().Select(row => new Row(row));
    }
}

ここまでは順調ですね。パズルの最後の平和は、ビューモデルを作成するコントローラーアクションにあります。

[HttpPost]
public ActionResult Index(RequestViewModel request)
{
    int id = request.Customers;
    int scheduleId = request.Jobs;
    DataTable dt = JobOperation.GetJobsBySchedulerIdAndCustomerId(scheduleId, id);

    // Now let's build the view model for the result:
    var model = new MyViewModel();
    model.Columns = dt.Columns.Cast<DataColumn>().Select(x => x.ColumnName);
    model.Values = dt.AsDynamicEnumerable();
    model.Customers = new SelectList(CustomerOperation.GetCustomers().Items, "Id", "Name");
    model.Jobs = new SelectList(JobOperation.GetCustomersAssemblyList().Items, "scheduleId", "name");

    return View(model);
}

そして今、私たちはもちろん強くタイプされたビューを持つことができます:

<%
    var grid = new WebGrid(Model.Values);
    var columns = Model.Columns.Select(x => grid.Column(x));
%>

<%= grid.GetHtml(columns: columns) %>

// and then we could have dropdowns and other stuff
<%= Html.DropDownListFor(x => x.SelectedCustomerId, Model.Customers, "-- customer --") %>
<%= Html.DropDownListFor(x => x.SelectedJobId, Model.Jobs, "-- job --") %>
于 2012-07-03T09:23:05.760 に答える