Как да извлека данни от множество частични изгледи, използвайки един и същ модел в рамките на един и същи изглед?

Нов съм в ASP.NET MVC, но създавам уеб сайт като Edfa3ly.com потребителят трябва да направи поръчка с множество елементи .. Използвах @Ajax.ActionLink, за да го накарам да добави друг елемент (като извика отново същия частичен изглед) проблемът е: когато щракнете върху запазване на поръчката, той запазва само 1 елемент (заменя първия) не знам как да запазете първия елемент, след това вземете другия.. Опитах се да сложа @Html.ActionLink, но той не валидира формуляра и също така предава нулев модел.

Това е гледката:

@model CSP1225.Models.OrderItemsModel

@{
    ViewBag.Title = "MakeOrder";
    Layout = "~/Views/Shared/_Layout.cshtml";
}




@using (Html.BeginForm("MakeOrder","Order",Model)) {
    @Html.AntiForgeryToken()
    <div class="container">
        <div>
    <div class="inner">

        @Html.LabelFor(m=>m.NewOrderDetails.fees)
        @Html.DisplayFor(m=>m.NewOrderDetails.fees)

        @Html.LabelFor(m=>m.NewOrderDetails.totalPrice)
        @Html.DisplayFor(m=>m.NewOrderDetails.totalPrice)

        @Html.LabelFor(m=>m.NewOrderDetails.totalWeight)
        @Html.DisplayFor(m=>m.NewOrderDetails.totalWeight)



  @Html.Partial("NewItem",Model.itemAdded)

       <div id="anotherItem">

       </div>


       @Ajax.ActionLink("another item", 
                 "NewItem",
                 new AjaxOptions { 
                 UpdateTargetId = "anotherItem"})
    </div>
            <input type="Submit" value="Save Order" />
        </div>
        </div>

}

Това е частичният изглед:

@model CSP1225.Models.ItemDetails


@using (Html.BeginForm()) {
    @Html.AntiForgeryToken()

    <div class="form-horizontal">
        <legend>Item Details</legend>
        <div class="inner">
          @Html.ValidationSummary()

        @Html.LabelFor(m=>m.itemName)
        @Html.TextBoxFor(m=>m.itemName)


        @Html.LabelFor(m=>m.itemUrl)
        @Html.TextBoxFor(m=>m.itemUrl)

        @Html.LabelFor(m=>m.quantity)
        @Html.TextBoxFor(m=>m.quantity)

        @Html.LabelFor(m=>m.weight)
        @Html.TextBoxFor(m=>m.weight)

        @Html.LabelFor(m=>m.unitprice)
        @Html.TextBoxFor(m=>m.unitprice)

        @Html.LabelFor(m=>m.Notes)
        @Html.TextBoxFor(m=>m.Notes)
<br />

        @Html.ActionLink("save item","NewItem","Order",Model.itemAdded,null)


</div>

        </div>
}

и това е моят модел:

        public class OrderItemsModel
        {
            public NewOrder NewOrderDetails { get; set; }
            public ItemDetails itemAdded { get; set; }

        }

     public class ItemDetails
        {
            [Required(ErrorMessage = "name Required")]
            public string itemName { get; set; }
            [Required(ErrorMessage = "URL Required")]
            [DataType(DataType.Url)]
            public string itemUrl { get; set; }
            public int quantity { get; set; }
            [Required(ErrorMessage = "price Required")]
            [DataType(DataType.Currency)]
            public Decimal unitprice { get; set; }
            public string color { get; set; }
            public string Size { get; set; }
            [Required(ErrorMessage = "weight Required")]
            public double weight { get; set; }
            public string Notes { get; set; }
            public IList<Item> itemList { get; set; }
        }

     public class NewOrder
        {

            [Required]
            [Display(Name = "Total weight")]
            public double totalWeight { get; set; }
            [Required]
            [Display(Name = "Total Price")]
            public decimal totalPrice { get; set; }
            [Required]
            [Display(Name = "Fees")]
            public double fees { get; set; }

            public DateTime OrderDate = DateTime.Now;
}

това е контролера:

 Order ord = new Order();
 ItemDetails it;
        List<Item> lstItem = new List<Item>();
       decimal tp = 0;
        double tw = 0;
        double f = 5.5;


    public PartialViewResult NewItem(OrderItemsModel item)
        {


return PartialView();

        }

    public PartialViewResult NewItemAdd(ItemDetails item)
    {
     if (item !=null)
     {
        it = new ItemDetails();
        it = item;
        CDB1225Entities _context = new CDB1225Entities();
        Item i = new Item();

        if (it != null)
        {
            i.ItemName = item.itemName;
            i.ItemURL = item.itemUrl;
            i.Notes = item.Notes;
            i.Price = item.unitprice;
            i.Quantity = item.quantity;
            i.Weight = item.weight;
            _context.Items.Add(i);

            lstItem.Add(i);
            tw = tw + i.Weight;
            tp = tp + i.Price;
            if (i.Weight >= 0.5)
            {
                f = (i.Weight / 0.5) * f;

            }
            else
            {
                f = 5.5;
            }

            item = null;
        }
            return PartialView();
        }
        return PartialView();
    }
}

person YaraHanaa    schedule 01.12.2013    source източник
comment
Опитвали ли сте да използвате персонализирани шаблони за редактор вместо частични изгледи? Това трябва да спре имената ви да се сблъскват   -  person Ant P    schedule 01.12.2013
comment
аз го направих.. но също така зарежда само един елемент!!   -  person YaraHanaa    schedule 01.12.2013
comment
Къде е вашият код за действие, който се извиква от вашия ActionLink   -  person Mir Gulam Sarwar    schedule 01.12.2013
comment
добавих го към въпроса...   -  person YaraHanaa    schedule 02.12.2013


Отговори (1)


Видяхте ли HTML кода, който всъщност пишете? пишете 2 <form>, подробностите вътре в Makeorder, идеята е просто да добавите контроли на формуляр, а не нов <form> таг, както прави вашето @using (Html.BeginForm()) повикване:

Изтрийте Html.BeginForm от частичния изглед (той ще бъде вграден в главния формуляр) и трябва да следвате същата конвенция за име, както правите във вашия обект, с други думи:

ще извикате itemName от вашия модел като Model.itemAdded.itemName, така че ще трябва да следвате същата конвенция във вашите частични изгледи:

<div class="form-horizontal">

    <legend>Item Details</legend>


    <label for="itemAdded.itemName">
       @Html.TextBox("itemAdded.itemName", Model.itemName)
    </label>

    <label for="itemAdded.itemUrl">
       @Html.TextBox("itemAdded.itemUrl", Model.itemUrl)
    </label>

    <label for="itemAdded.quantity">
       @Html.TextBox("itemAdded.quantity", Model.quantity)
    </label>

    <label for="itemAdded.weight">
       @Html.TextBox("itemAdded.weight", Model.weight)
    </label>

    <label for="itemAdded.unitprice">
       @Html.TextBox("itemAdded.unitprice", Model.unitprice)
    </label>

    <label for="itemAdded.Notes">
       @Html.TextBox("itemAdded.Notes", Model.Notes)
    </label>


</div>

Не разбирайте бутона Save, тъй като основният формуляр може да има самия бутон Запазване, просто го добавете там.

Във вашето Controller, което има действието за Orders/MakeOrder всичко, което трябва да имате е:

[HttpPost]
public ActionResult(OrderItemsModel model) 
{
    // here your model will have all the passed form inputs
}
person balexandre    schedule 02.12.2013
comment
Бутонът Запазване е за запазване на артикула в поръчката и добавяне на друг.. но искате да кажете, че използвам модела OrderItemsModel или ItemDetails?? в частичен изглед.. - person YaraHanaa; 02.12.2013
comment
В модела ти няма IEnumberable, с други думи в модела, който показваш във въпроса си, няма Колекция, за такива не се разбира никъде да имаш кратно! Ако искате да имате множество серии от обект, вече отговорих на няколко въпроса за това преди много време, тъй като това е нормален въпрос. Ще се опита да намери... - person balexandre; 02.12.2013
comment
Моля, публикувайте целия обектен модел (включително List<T>, за да можем да ви помогнем по-добре) - person balexandre; 02.12.2013
comment
тогава трябва да използвате този отговор, за да попълните формуляра си: stackoverflow.com/a/9307173/28004 - person balexandre; 02.12.2013
comment
Благодаря ти многоооооооооооого :) - person YaraHanaa; 02.12.2013