-1

私がやろうとしているのは、保存された製品の「スーパー」エンティティクラスを持つことです。製品がアプリケーションのどこにあるかに応じて、特定の追加の属性が必要になります(常にではありません)。

たとえば、製品がグリッド内で使用されている場合、エンティティから派生した(すべての共通フィールドを継承する)ViewModelを作成し、「rowNumber」などの一意の識別子属性を追加して、剣道UIで簡単に検索できるようにします。グリッドCRUD。

私はこれがすべて機能していると思っていましたが、問題が発生しました...バッチグリッドの[保存]をクリックするまで、すべてが正常にレンダリングされ、正しく動作します。関数を実行し、すべてのデータが存在しますが、CRUDから戻ると壊れます。Firebugで、例外がスローされているのがわかりますが、それが終了することはなく(ajaxスピナーはそこにとどまります)、例外内のすべての情報は空です...

これがCSLAでうまく機能しないc#の問題であるかどうかはわかりません。よくわかりません。

どんな助けでもいただければ幸いです!担当者の人数が足りないため、画像をアップロードできません。そうでない場合は、例外の写真を掲載しますが、少なくともFirebugコンソールに表示されるものを掲載します。それについての他のすべてはしかし空です...

無限の実行と応答なしの例外:

GET http://localhost:32574/Exception/SystemException/00000000-0000-0000-0000-000000000000

エンティティ: このファイルはCodeSmithテンプレートによって自動生成されるため、無意味ですが、ビューに表示されるフィールド値を保持します(以下を参照)。ビューにあるものとエンティティにあるものの例外は、エンティティ内で「フラット化」されていないフィールドです。これは、KendoUIが現在編集可能なグリッド内でこれをサポートしていないためです。

ViewModel:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.ComponentModel.DataAnnotations;

namespace Project.MVC.Models
{
    //The MetaData Class is where to put all annotations and validations
    [MetadataType(typeof(Project.Business.Shipment.ItemMetaDataClass))]
    public class ItemModel : Project.Business.Shipment.Item
    {
        public ItemModel()
        {
        }

        public long rowNumber { get; set; }

        public decimal Length { get; set; }
        public decimal Width { get; set; }
        public decimal Height { get; set; }

        [Display(Name = "UoMDim")]
        [UIHint("ItemGrid_RefUnitOfMeasurementListingDimension")]
        public string DimensionUnitOfMeasure { get; set; }

        [Display(Name = "UoMW")]
        [UIHint("ItemGrid_RefUnitOfMeasurementListingWeight")]
        public string WeightUnitOfMeasure { get; set; }

        [Display(Name = "Weight")]
        public decimal WeightValue { get; set; }

        [Display(Name = "Type")]
        [UIHint("ItemGrid_RefUnitTypeListing")]
        public string QuantityUnitOfMeasure { get; set; }

        [Display(Name = "Units")]
        public decimal QuantityValue { get; set; }
}
}

グリッドコントローラー:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using Kendo.Mvc.UI;
using Kendo.Mvc.Extensions;

namespace Project.MVC.Controllers
{
    [Authorize]
    public class ItemGridController : Csla.Web.Mvc.Controller
    {
        public ActionResult GetProducts([DataSourceRequest]DataSourceRequest request)
        {
            Project.MVC.Models.ShipmentModel shipmentModel = (Project.MVC.Models.ShipmentModel)ControllerBase.State.Object;

            return Json(shipmentModel.ItemModelList.ToDataSourceResult(request));
        }

        [AcceptVerbs(HttpVerbs.Post)]
        public ActionResult CreateProducts([DataSourceRequest]DataSourceRequest request, [Bind(Prefix = "models")]IEnumerable<Models.ItemModel> itemsToAdd)
        {
            Project.MVC.Models.ShipmentModel shipmentModel = (Project.MVC.Models.ShipmentModel)ControllerBase.State.Object;
            var results = new List<Models.ItemModel>();

            if (ModelState.IsValid)
            {
                foreach (Models.ItemModel newItem in itemsToAdd)
                {

                    if (shipmentModel.ItemModelList.Count > 0)
                    {
                        var nextID = (from i in shipmentModel.ItemModelList
                                      select i.rowNumber).Max() + 1;

                        newItem.rowNumber = nextID;
                    }

                    shipmentModel.ItemModelList.Add(newItem);
                    results.Add(newItem);
                }
            }

            return Json(results.ToDataSourceResult(request, ModelState));
        }

        [AcceptVerbs(HttpVerbs.Post)]
        public ActionResult UpdateProducts([DataSourceRequest]DataSourceRequest request, [Bind(Prefix = "models")]IEnumerable<Models.ItemModel> itemsToUpdate)
        {
            Project.MVC.Models.ShipmentModel shipmentModel = (Project.MVC.Models.ShipmentModel)ControllerBase.State.Object;
            var results = new List<Models.ItemModel>();

            foreach (var item in itemsToUpdate)
            {
                Models.ItemModel target = shipmentModel.ItemModelList.Find(i => i.rowNumber == item.rowNumber);
                if (target != null)
                {
                    target = item;
                }
            }

            return Json(ModelState.ToDataSourceResult());
        }

        [AcceptVerbs(HttpVerbs.Post)]
        public ActionResult DeleteProducts([DataSourceRequest]DataSourceRequest request, [Bind(Prefix = "models")]IEnumerable<Models.ItemModel> itemsToDelete)
        {
            Project.MVC.Models.ShipmentModel shipmentModel = (Project.MVC.Models.ShipmentModel)ControllerBase.State.Object;

            foreach (var item in itemsToDelete)
            {
                shipmentModel.ItemModelList.Remove(item);
            }

            return Json(ModelState.ToDataSourceResult());
        }
    }
}

意見:

@model Project.MVC.Models.ShipmentModel
@using Kendo.Mvc.UI

@(Html.Kendo().Grid<Project.MVC.Models.ItemModel>()
    .Name("QuoteItemGrid")
    .Columns(columns =>
    {
        columns.Bound(i => i.FreightClass)
            .EditorTemplateName("ItemGrid_RefFreightClassListing")
            .Width(50);
        columns.Bound(i => i.Length).Width(30);
        columns.Bound(i => i.Width).Width(30);
        columns.Bound(i => i.Height).Width(30);
        columns.Bound(i => i.DimensionUnitOfMeasure)
            .EditorTemplateName("ItemGrid_RefUnitOfMeasurementListingDimension")
            .Width(50);
        columns.Bound(i => i.QuantityValue).Width(30);
        columns.Bound(i => i.QuantityUnitOfMeasure)
            .EditorTemplateName("ItemGrid_RefUnitTypeListing")
            .Width(50);
        columns.Bound(i => i.WeightValue).Width(30);
        columns.Bound(i => i.WeightUnitOfMeasure)
            .EditorTemplateName("ItemGrid_RefUnitOfMeasurementListingWeight")
            .Width(50);
        columns.Bound(i => i.NmfcCode).Width(50);
        columns.Bound(i => i.ItemDescription).Width(100);
        columns.Command(command =>
        {
            command.Destroy();
        }).Width(60);
    })
    .ToolBar(toolbar =>
    {
        toolbar.Create();
        toolbar.Save();
    })
    .Editable(editable => editable.Mode(GridEditMode.InCell).CreateAt(GridInsertRowPosition.Bottom))
    .Pageable()
    .Sortable()
    .Scrollable()
    .Resizable(resize => resize.Columns(true))
    .DataSource(dataSource => dataSource
        .Ajax()
        .Batch(true)
        .ServerOperation(false)
        .Events(events => events.Error("QuoteItemGrid_ErrorHandler"))
        .Model(model =>
        {
            model.Id(i => i.rowNumber);
            model.Field(i => i.DimensionUnitOfMeasure).DefaultValue("in");
            model.Field(i => i.WeightUnitOfMeasure).DefaultValue("lbs");
        })
        .Create(create => create.Action("CreateProducts", "ItemGrid"))
        .Read(read => read.Action("GetProducts", "ItemGrid"))
        .Update(update => update.Action("UpdateProducts", "ItemGrid"))
        .Destroy(destroy => destroy.Action("DeleteProducts", "ItemGrid"))
    )
)
4

2 に答える 2

1

私は完全に同意します。理想的には、CSLA .NETベースのオブジェクトはデータオブジェクトではなくドメインオブジェクトであるため、データベーステーブルやクエリではなく、ビジネス要件に必要な形状に一致します。

悲しいことに、多くの人がORMのようにCSLAを(誤って)使用することになり、データ中心のオブジェクトを持っているため、フレームワークの価値の多くを失い、何に加えて過度に複雑なビューモデルタイプの作成と保守が必要になります(あるべきだった)業種。

于 2013-02-11T06:52:29.123 に答える
0

アーキテクチャの観点から、私のグループは最終的に、データベースで生成されたエンティティを私たちのビューに非常に密接に結び付けることは賢明ではないと考えました。特に現在、プロジェクトは複数の場所(.Netアプリケーション、Webサービスアプリケーションなど)で使用されています。

そのため、最終的には、エンティティごとにViewModelを作成して、複数のプラットフォームにまたがるエンティティに柔軟に対応できるようにしました。この再構築により、エンティティがビュー内に存在しなくなるため、上記の問題が解消されました。

ただし、注意点:Kendo UIを使用している場合は、深いオブジェクト(別のオブジェクト内のオブジェクトなど)である単一のコンポーネント内に表示するビューモデルを「フラット化」する必要があります。現時点では、剣道はこれをサポートしていません。ValueInjecterを使用しています。

うまくいけば、この情報が他の誰かにも役立つことを願っています。

于 2012-10-05T14:28:00.093 に答える