Ext.NET: доступ к полю сложной модели в ColumnModel - PullRequest
0 голосов
/ 04 октября 2018

У меня проблемы с отображением столбца в Ext.NET.У меня есть следующий код вида:

@(x.Store(
    x.Store()
        .ID("MyStore")
        .AutoLoad(true)
        .Proxy(
            x.AjaxProxy()
                .Url(Url.Action("GetData", "MyController", new { id = Model.Id }))
                .Reader(x.JsonReader().RootProperty("data")))
        .Model(
                x.Model()
                    .Fields(
                        x.ModelField()
                            .Fields(f =>
                            {
                                f.Add("Plan.Value", ModelFieldType.String);
                                f.Add("Plan.IsUrl", ModelFieldType.Boolean);
                            })
                            .IsComplex(true)
                            .Persist(false),
                        x.ModelField()
                            .Name("Id")
                            .Type(ModelFieldType.Int)
                            .Persist(false)))))

@(x.GridPanel()
    .ID("MyPanel")
    .StoreID("MyStore")
    .Selectable(true)
    .HeaderBorders(false)
    .ColumnModel(
        x.Column()
            .DataIndex("Plan.Value")
            .Text("Plan")
            .Width(500)))

Мой контроллер выглядит так:

public class MyController : Controller
{
    private readonly IDataViewModelFactory _storeModelFactory;

    public MyController(IDataViewModelFactory factory)
    {
        if (factory == null)
        {
            throw new ArgumentNullException("factory");
        }

        _storeModelFactory = factory;
    }

    public ActionResult Index(DataListStoreModel model)
    {
        var viewModel = new DataViewModel
        {
            Name = model.Name,
            Id = model.Id
        };

        return View(viewModel);
    }

    public StoreResult GetData(int id)
    {
        var models = _storeModelFactory.GetStoreResults(id);
        return new StoreResult(models);
    }
}

И мои модели:

public class Data
{
    public UrlTextUnion Plan { get; set; }

    public int Id { get; set; }
}

public class UrlTextUnion
{
    public string Value { get; set; }

    public bool IsUrl { get; set; }

    public UrlTextUnion(string value)
    {
        Value = value;
        IsUrl = Uri.IsWellFormedUriString(value, UriKind.Absolute);
    }
}

Теперь я знаю, что яЯ получаю данные, и если я добавлю слушателя JavaScript, я вижу, что record.Data.Value и record.Data.IsUrl содержат данные, но столбец в моей модели остается пустым.Может кто-нибудь сказать мне, что здесь происходит?

1 Ответ

0 голосов
/ 05 октября 2018

У вас есть два варианта здесь.

1.Добавьте Renderer в Column в GridPanel:

Сохраните ваш магазин, как в вашем примере, и измените вашу ColumnModel в GridPanel на что-то вроде этого:

.ColumnModel(
    Html.X().Column()
        .Renderer(new Renderer("return record.data.Plan.Value"))
        .Text("Plan")
        .Width(500)))

2.Измените свои поля в модели магазина и GridPanel:

Добавьте сопоставление и имя в свои поля магазина:

Html.X().Model()
    .Fields(
        Html.X().ModelField()
            .Name("PlanValue")
            .Mapping("Plan.Value")
            .Type(ModelFieldType.String)
            .Persist(false),
        Html.X().ModelField()
            .Name("PlanId")
            .Mapping("Plan.Id")
            .Type(ModelFieldType.Int)
            .Persist(false),
        Html.X().ModelField()
            .Name("Id")
            .Type(ModelFieldType.Int)
            .Persist(false)))))

И измените свою Grid ColumnModel:

.ColumnModel(
    Html.X().Column()
        .DataIndex("PlanValue")
        .Text("Plan")
        .Width(500)))

PS

Скорее всего, вам следует изменить:

.Url(Url.Action("GetData", "MyController", new { id = Model.Id }))

на

.Url(Url.Action("GetData", "My", new { id = Model.Id }))
...