Fyller komplekse objekter fra visningen, på post, ved hjelp av grensesnitt

stemmer
0

Jeg prøver å legge inn data fra en haug med tekstfelt med følgende:

Controller:

[HttpGet]
        public ActionResult Order()
        {
            OrderViewModel vm = new OrderViewModel();
            vm.Id = some id;
            List<IOrderItem> itemList= new List<IOrderItem>();
            for (int i = 0; i <= 10; i++)
            {
                OrderItem x = new OrderItem();
                x.ItemId = i + ;
                itemList.Add(x);
            }
            vm.OrderItemList = itemList;
            return View(vm);
        }


        [HttpPost]
        public IActionResult Order(OrderViewModel model)
        {
            return View(blabla);
        }

Dette er modellene:

public class OrderViewModel : B.IOrderItemViewModel
{

    private List<IOrderItem> orderItems;
    public List<IOrderItem> OrderItemList
    {
        get { return orderItems; }
        set { orderItems = value; }
    }

    private string orderId;
    public string Id
    {
        get { return orderId; }
        set { orderId = value; }
    }


}

public class OrderItem : IOrderItem
{
    private string orderItemId;
    public string ItemId
    {
        get { return orderItemId; }
        set { orderItemId = value; }
    }

    private string _description;
    public string Description
    {
        get { return _description; }
        set { _description = value; }
    }
}

Dette er utsikten:

@model OrderViewModel

@using (Html.BeginForm(Order, Home, FormMethod.Post))
{
    @for (int i = 0; i < Model.OrderItemList.Count; i++)
    {
        @Html.HiddenFor(x => x.OrderItemList[i].ItemId)
        @Html.TextBoxFor(x => x.OrderItemList[i].Description)
        <br />
    }

    <input type=submit value=submit />
}

Her er problemet - Grensesnittene er i et annet prosjekt, la oss kalle det B. jeg referere B i project.json filen for hovedprosjektet, A. I B, jeg bare definert de to grensesnittene det er arvet ovenfor.

Hvis jeg ikke bruker noen grensesnitt, og jeg bare bruke objekter f.eks i stedet for:

List<IOrderItem> OrderItemList

Jeg bruker :

List<OrderItem> OrderItemList

Når jeg kjører prosjektet, og traff utsikten, ser jeg tekstboksene. Jeg fylle ut noen data og treffer sender. Det går til kontrolleren som forventet. Hvis jeg setter et stoppunkt i HttpPost actionresult metoden, og se på modellen, kan jeg se alle dataene jeg kom inn. Perfekt.

Hvis jeg bruker koden ovenfor, hvor jeg arvet fra noen grensesnitt, det fungerer ikke. Visningen belastninger, jeg går inn i noen data, jeg legger inn, den treffer stoppunkt, men modellen er tom, og det er alt null.

Noen ideer / hjelpe ville være verdsatt!

Publisert på 11/12/2014 klokken 20:45
kilden bruker
På andre språk...                            


1 svar

stemmer
1

Du kan ikke binde seg til grensesnitt. Prosessen med modellen bindende innebærer første initialisering modellen (internt DefaultModelBinderbruk Activator.CreateInstance()), men du kan ikke initialisere et grensesnitt (hvordan ville det vet hvilken type initialisere), noe som er grunnen

public List<OrderItem> OrderItemList { get; set; }

gjerninger, men

public List<IOrderItem> OrderItemList { get; set; }

wont.

Denne artikkelen diskuterer det mer detaljer og omfatter en del om å lage en tilpasset Abstract Model Binder som kan løse problemet.

Svarte 11/12/2014 kl. 23:36
kilden bruker

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more