0

This is my first program and I am quite not sure on how to complete my codes. I am trying to create a new transaction, where for a supplier there will be multiple inventory types. I am lost on how to add the inventory types to a list using Partial View. Any guidance on how to structure the code will be greatly appreciated. Here are my codes:

ViewModels:

public class InventoryTransactionParent
    {
        [Key]
        public int InventoryTransactionID { get; set; }

        [ForeignKey("InventoryTransactionType")]
        [Display(Name = "Transaction Type")]
        public int InventoryTransactionTypeID { get; set; }
        public virtual InventoryTransactionType InventoryTransactionType { get; set; }

        [Display(Name = "Supplier")]
        [ForeignKey("Supplier")]
        public int? SupplierID { get; set; }
        public virtual Supplier Supplier { get; set; }

        [Display(Name = "Transaction Date (From previous month only)")]
        [DisplayFormat(ApplyFormatInEditMode = true, DataFormatString = "{0:dd/MM/yyyy}")]
        public DateTime InventoryTransactionDate { get; set; }

        [Display(Name = "Receipt/Invoice No.")]
        public string InventoryTransactionReceipt { get; set; }

        [Display(Name = "Transaction By")]
        public string InventoryTransactionBy { get; set; }

        [Display(Name = "Created On")]
        public DateTime InventoryTransactionCreatedDateTime { get; set; }

        [Display(Name = "Created By")]
        public string InventoryTransactionCreatedBy { get; set; }

        public bool InventoryTransactionCancelled { get; set; }
        public int? InventoryTransactionCancelledSourceID { get; set; }

        public List<InventoryTypeChild> InventoryTypeChilds { get; set; }
    }

public class InventoryTypeChild
    {
        [ForeignKey("InventoryType")]
        [Display(Name = "Inventory Type")]
        public int InventoryTypeID { get; set; }
        public virtual InventoryType InventoryType { get; set; }

        [Display(Name = "Quantity")]
        public decimal InventoryTransactionQuantity { get; set; }

        [Display(Name = "Price per Item")]
        public decimal InventoryTransactionPrice { get; set; }

        [Display(Name = "Remarks (1000 characters)")]
        [DataType(DataType.MultilineText)]
        public string InventoryTransactionRemarks { get; set; }
    }

View:

@model Inventory.ViewModels.InventoryTransactionParent
    @using (Html.BeginForm()) {
    @Html.ValidationSummary(true)



  <fieldset>
        <legend>In Transaction</legend>


        <div class="editor-label">
            @Html.LabelFor(model => model.SupplierID, "Supplier")
        </div>
        <div class="editor-field">
            @Html.DropDownList("SupplierID", String.Empty)
            @Html.ValidationMessageFor(model => model.SupplierID)
        </div>

        <div class="editor-label">
            @Html.LabelFor(model => model.InventoryTransactionDate)
        </div>
        <div class="editor-field">
            @Html.EditorFor(model => model.InventoryTransactionDate, "TransactionDate")
        </div>

        <div class="editor-label">
            @Html.LabelFor(model => model.InventoryTransactionReceipt)
        </div>
        <div class="editor-field">
            @Html.EditorFor(model => model.InventoryTransactionReceipt)
            @Html.ValidationMessageFor(model => model.InventoryTransactionReceipt)
        </div>
        <div id="inventorytypes">
            @using (Html.BeginForm()) {
                <table>
                    <tr>
                        <td>@Html.LabelFor(model => Model.InventoryTypeChilds[0].InventoryTypeID)</td>
                        <td>@Html.LabelFor(model => Model.InventoryTypeChilds[0].InventoryTransactionPrice)</td>
                        <td>@Html.LabelFor(model => Model.InventoryTypeChilds[0].InventoryTransactionQuantity)</td>
                        <td>@Html.LabelFor(model => Model.InventoryTypeChilds[0].InventoryTransactionRemarks)</td>
                        <td></td>
                    </tr>
                @{
                    if (Model.InventoryTypeChilds != null)
                    {
                        for (int i = 0; i < Model.InventoryTypeChilds.Count(); i++)
                        {
                            <tr>
                                <td>
                                    @Html.DropDownList("InventoryTypeID", String.Empty)
                                    @Html.ValidationMessageFor(model => model.InventoryTypeChilds[i].InventoryTypeID)
                                </td>
                                <td>
                                    @Html.EditorFor(model => Model.InventoryTypeChilds[i].InventoryTransactionPrice)
                                    @Html.ValidationMessageFor(model => Model.InventoryTypeChilds[i].InventoryTransactionPrice)
                                </td>
                                <td>
                                    @Html.EditorFor(model => Model.InventoryTypeChilds[i].InventoryTransactionQuantity)
                                    @Html.ValidationMessageFor(model => Model.InventoryTypeChilds[i].InventoryTransactionQuantity)
                                </td>
                                <td>
                                    @Html.EditorFor(model => Model.InventoryTypeChilds[i].InventoryTransactionRemarks)
                                    @Html.ValidationMessageFor(model => Model.InventoryTypeChilds[i].InventoryTransactionRemarks)
                                </td>
                                <td>
                                    <input type="submit" value="Add" />
                                </td>
                            </tr>
                        }
                    }
                }
                </table>
            }
        </div>
        <p>
            <input type="submit" value="In" />
        </p>
    </fieldset>
}

Controller (still very rough):

public ActionResult InMultipleTransaction()
        {
            ViewBag.InventoryTypeID = new SelectList(db.InventoryTypes, "InventoryTypeID", "InventoryTypeName");
            ViewBag.SupplierID = new SelectList(db.Suppliers, "SupplierID", "SupplierName");
            InventoryTransactionParent itp = new InventoryTransactionParent();
            itp.InventoryTypeChilds = new List<InventoryTypeChild>();
            itp.InventoryTypeChilds.Add(new InventoryTypeChild()
            {

            });

            return View(itp);
        }
blurryMVC
  • 93
  • 2
  • 12

1 Answers1

0

You don't need to use Partial Views in one-to-many relationship. Partial Views are useful if parent and child objects are being created at the same time, mostly happens in one-to-one relationship (But even then, most people use ViewModels). But in your case, you have to have parent object created first then you add many child objects.

This Plural Sight video would be a good way to start. There is a free trial

Komengem
  • 3,662
  • 7
  • 33
  • 57
  • Hi, my requirement requires me to create parent and child at the same time. Hence I need to keep the list in cache until it is submitted to the database. Therefore I think something like Partial Views – blurryMVC May 08 '13 at 18:50
  • @blurryMVC I think you need to revisit your application design requirements. We are talking about infinite number of `Child Objects`. You cannot create them at the same time as `Parent Object`, atleast not to my knowledge. – Komengem May 08 '13 at 19:16
  • Ic, thanks I'll try to take a look. I have some related question though, I tried to submit with only 1 member in the List. However the controller doesn't capture @Html.DropDownList("InventoryTypeID", String.Empty) value. Is there something I missed? – blurryMVC May 08 '13 at 19:25
  • @blurryMVC That is enough for another question, mention it here when you ask and i will try to help. – Komengem May 08 '13 at 19:36
  • I found out the issue. I should use DropDownListFor instead DropDownList. Thx! – blurryMVC May 08 '13 at 19:47
  • @blurryMVC good, also here is one of the answers i gave a while back. http://stackoverflow.com/questions/15441127/populating-and-selecting-a-drop-down-list-value-in-asp-net-mvc-4/15445440#15445440 – Komengem May 08 '13 at 19:48