Как получить данные из нескольких частичных представлений, используя одну и ту же модель в одном и том же представлении?

Я новичок в ASP.NET MVC, но я создаю веб-сайт, например Edfa3ly.com, пользователь должен сделать заказ с несколькими элементами. Я использовал @Ajax.ActionLink, чтобы заставить его добавить еще один элемент (снова вызвав тот же частичный вид), проблема в том, что при щелчке по порядку сохранения он сохраняет только 1 элемент (он перезаписывает 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