0

i am trying submit form but it is not hitting no my post action method. i am also loading partial view through ajax but where ever i am passing orderViewModel it stop working. i also tried to used [FromBody] like Create([FromBody]OrderViewModel model) It giving me 415 error. Link to my previous post

@model SoftwareHouseWeb.ViewModel.OrderViewModel.OrderViewModel
@using SoftwareHouseWeb.Data.Models.Orders
@{
    ViewData["Title"] = "Order";
    Layout = "~/Views/Shared/_Layout1.cshtml";
    List<string> Preferences = new List<string>() { "Phone", "Chat", "Email", "SMS" };
}




<form method="post" asp-controller="Order" asp-action="Create" class="signup-form">
    <div>
      
        <div asp-validation-summary="All" class="text-danger"></div>

        <div class="signup-form" id="page_1">
            <div class="head">
                <h1>Your Personal Details</h1>
            </div>
            <div class="ui big form">
                <div class="two fields">
                    <div class="six wide field">
                        <label>Name</label>
                        <input asp-for="cus_name" placeholder="Name">
                        <span asp-validation-for="cus_name" class="text-danger"></span>
                    </div>
                    <div class="six wide field">
                        <label>Email</label>
                        <input asp-for="Email" placeholder="Email">
                        <span asp-validation-for="Email" class="text-danger"></span>
                    </div>
                </div>
                <div class="two fields">
                    <div class="six wide field">
                        <select asp-for="Country" class="ui search dropdown">
                            <option value="">Select Country</option>
                            <option value="AF">Afghanistan</option>
                            <option value="AX">Åland Islands</option>
                            <option value="AL">Albania</option>
                            <option value="DZ">Algeria</option>
                            <option value="AS">American Samoa</option>
                            <option value="AD">Andorra</option>
                            <option value="AO">Angola</option>
                            <option value="AI">Anguilla</option>
                            <option value="AQ">Antarctica</option>
                            <option value="AG">Antigua and Barbuda</option>
                            <option value="AR">Argentina</option>
                            <option value="AM">Armenia</option>
                            <option value="AW">Aruba</option>
                            <option value="AU">Australia</option>
                            <option value="AT">Austria</option>
                            <option value="AZ">Azerbaijan</option>
                            <option value="BS">Bahamas</option>
                            <option value="BH">Bahrain</option>
                            <option value="BD">Bangladesh</option>
                            <option value="BB">Barbados</option>
                            <option value="YE">Yemen</option>
                            <option value="ZM">Zambia</option>
                            <option value="ZW">Zimbabwe</option>
                        </select>
                        <span asp-validation-for="Country" class="text-danger"></span>
                    </div>
                    <div class="six wide field">
                        <input asp-for="cus_phone" placeholder="Phone Number">
                        <span asp-validation-for="cus_phone" class="text-danger"></span>
                    </div>
                </div>
                <div class="two fields">
                    <div class="six wide field">
                        <label>Select First preferred medium</label>
                        <select asp-for="FirstPreferences" class="custom-select mr-sm-2"
                                asp-items="@(new SelectList(Preferences))">
                            <option value="">Select</option>
                        </select>

                        <span asp-validation-for="FirstPreferences" class="text-danger"></span>
                    </div>
                    <div class="six wide field">
                        <label>Select 2ND preferred medium</label>
                        <select asp-for="SecondPreferences" class="custom-select mr-sm-2"
                                asp-items="@(new SelectList(Preferences))">
                            <option value="">Select</option>
                        </select>

                        <span asp-validation-for="SecondPreferences" class="text-danger"></span>
                    </div>
                </div>
                <div class="" style="margin: 2rem;">
                    <h2>
                        Time Preferences
                    </h2>
                    <p>Please provide preferred time to contact you according to your area. We highly recommend you to provide more than one preferred contact time. This will increase your availability and will expedite the communication procedure.</p>
                </div>
                <div class="two fields">
                    <div class="six wide field">
                        <label>Select First  Time Preferences</label>
                        <div class="row">
                            <div class="col-2">

                                <div class="ui selection dropdown time">
                                    <select asp-for="FirstPreferedTimeStart" class="menu">
                                        <option value="">HH:MM</option>
                                        <option value="00:00:00">00:00</option>
                                        <option value="01:00:00">01:00</option>
                                        <option value="02:00:00">02:00</option>
                                        <option value="03:00:00">03:00</option>
                                        <option value="04:00:00">04:00</option>
                                        <option value="05:00:00">05:00</option>
                                        <option value="06:00:00">06:00</option>
                                        <option value="07:00:00">07:00</option>
                                        <option value="08:00:00">08:00</option>
                                        <option value="09:00:00">09:00</option>
                                        <option value="10:00:00">10:00</option>
                                        <option value="11:00:00">11:00</option>
                                        <option value="12:00:00">12:00</option>
                                        <option value="13:00:00">13:00</option>
                                        <option value="14:00:00">14:00</option>
                                        <option value="15:00:00">15:00</option>
                                        <option value="16:00:00">16:00</option>
                                        <option value="17:00:00">17:00</option>
                                        <option value="18:00:00">18:00</option>
                                        <option value="19:00:00">19:00</option>
                                        <option value="20:00:00">20:00</option>
                                        <option value="21:00:00">21:00</option>
                                        <option value="22:00:00">22:00</option>
                                        <option value="23:00:00">23:00</option>
                                    </select>
                                </div>
                                <span asp-validation-for="FirstPreferedTimeStart" class="text-danger"></span>
                            </div>
                            <div class="col-2">
                                <div class="ui selection dropdown time">
                                    <select asp-for="FirstPreferedTimeEnd" class="menu">
                                        <option value="">HH:MM</option>
                                        <option value="00:00:00">00:00</option>
                                        <option value="01:00:00">01:00</option>
                                        <option value="02:00:00">02:00</option>
                                        <option value="03:00:00">03:00</option>
                                        <option value="04:00:00">04:00</option>
                                        <option value="05:00:00">05:00</option>
                                        <option value="06:00:00">06:00</option>
                                        <option value="07:00:00">07:00</option>
                                        <option value="08:00:00">08:00</option>
                                        <option value="09:00:00">09:00</option>
                                        <option value="10:00:00">10:00</option>
                                        <option value="11:00:00">11:00</option>
                                        <option value="12:00:00">12:00</option>
                                        <option value="13:00:00">13:00</option>
                                        <option value="14:00:00">14:00</option>
                                        <option value="15:00:00">15:00</option>
                                        <option value="16:00:00">16:00</option>
                                        <option value="17:00:00">17:00</option>
                                        <option value="18:00:00">18:00</option>
                                        <option value="19:00:00">19:00</option>
                                        <option value="20:00:00">20:00</option>
                                        <option value="21:00:00">21:00</option>
                                        <option value="22:00:00">22:00</option>
                                        <option value="23:00:00">23:00</option>
                                    </select>
                                </div>
                                <span asp-validation-for="FirstPreferedTimeEnd" class="text-danger"></span>
                            </div>
                        </div>
                    </div>
                    <div class="six wide field">
                        <label>Select Second Time Preferences</label>
                        <div class="row">
                            <div class="col-2">
                                <div class="ui selection dropdown time">
                                    <select asp-for="SecondPreferedTimeStart" class="menu">
                                        <option value="">HH:MM</option>
                                        <option value="00:00:00">00:00</option>
                                        <option value="01:00:00">01:00</option>
                                        <option value="02:00:00">02:00</option>
                                        <option value="03:00:00">03:00</option>
                                        <option value="04:00:00">04:00</option>
                                        <option value="05:00:00">05:00</option>
                                        <option value="06:00:00">06:00</option>
                                        <option value="07:00:00">07:00</option>
                                        <option value="08:00:00">08:00</option>
                                        <option value="09:00:00">09:00</option>
                                        <option value="10:00:00">10:00</option>
                                        <option value="11:00:00">11:00</option>
                                        <option value="12:00:00">12:00</option>
                                        <option value="13:00:00">13:00</option>
                                        <option value="14:00:00">14:00</option>
                                        <option value="15:00:00">15:00</option>
                                        <option value="16:00:00">16:00</option>
                                        <option value="17:00:00">17:00</option>
                                        <option value="18:00:00">18:00</option>
                                        <option value="19:00:00">19:00</option>
                                        <option value="20:00:00">20:00</option>
                                        <option value="21:00:00">21:00</option>
                                        <option value="22:00:00">22:00</option>
                                        <option value="23:00:00">23:00</option>
                                    </select>
                                </div>
                                <span asp-validation-for="SecondPreferedTimeStart" class="text-danger"></span>
                            </div>
                            <div class="col-2">
                                <div class="ui selection dropdown time">
                                    <select asp-for="SecondPreferedTimeEnd" class="menu">
                                        <option value="">HH:MM</option>
                                        <option value="00:00:00">00:00</option>
                                        <option value="01:00:00">01:00</option>
                                        <option value="02:00:00">02:00</option>
                                        <option value="03:00:00">03:00</option>
                                        <option value="04:00:00">04:00</option>
                                        <option value="05:00:00">05:00</option>
                                        <option value="06:00:00">06:00</option>
                                        <option value="07:00:00">07:00</option>
                                        <option value="08:00:00">08:00</option>
                                        <option value="09:00:00">09:00</option>
                                        <option value="10:00:00">10:00</option>
                                        <option value="11:00:00">11:00</option>
                                        <option value="12:00:00">12:00</option>
                                        <option value="13:00:00">13:00</option>
                                        <option value="14:00:00">14:00</option>
                                        <option value="15:00:00">15:00</option>
                                        <option value="16:00:00">16:00</option>
                                        <option value="17:00:00">17:00</option>
                                        <option value="18:00:00">18:00</option>
                                        <option value="19:00:00">19:00</option>
                                        <option value="20:00:00">20:00</option>
                                        <option value="21:00:00">21:00</option>
                                        <option value="22:00:00">22:00</option>
                                        <option value="23:00:00">23:00</option>
                                    </select>
                                </div>
                                <span asp-validation-for="SecondPreferedTimeEnd" class="text-danger"></span>
                            </div>
                        </div>
                    </div>
                </div>
                <div class="form-group">
                    <label asp-for="Message" class="control-label "></label>
                    <textarea asp-for="Message" class="form-control"> </textarea>
                    <span asp-validation-for="Message" class="text-danger"></span>
                </div>

                <input type="button" onclick="PageNext(this.parentElement.parentElement)" class="ui primary submit button" value="SAVE & CONTINUE" />
            </div>

        </div>
        <div id="page_2" style="display:none">
            <div>
                <h1 id="heading">Choose a Package!</h1>
            </div>
            <div class="buttons">
                @foreach (var services in Model.ServicesPackages)
                {
                    <a href="#service_@services.Ser_Id"><div class="logo-p"><h2>@services.Ser_Name</h2></div></a>
                }
            </div>

            <!-- packages -->
            @for (int i = 0; i < Model.ServicesPackages.Count; i++)
            {

                <div class="packages" id="service_@Model.ServicesPackages[i].Ser_Id">
                    <h1 id="custom-website-design">
                        @Model.ServicesPackages[i].Ser_Name

                    </h1>
                    <div class="packs-content">

                        @for (int j = 0; j < Model.ServicesPackages[i].Packages.Count(); j++)
                        {

                            <div class="pack1">
                                <div class="pack-price">
                                    <div>
                                        <input asp-for="@Model.ServicesPackages[i].Packages[j].id" hidden />
                                        <input asp-for="@Model.ServicesPackages[i].Packages[j].PkgName" hidden />
                                        <input asp-for="@Model.ServicesPackages[i].Packages[j].Ser_Id" hidden />
                                        <input asp-for="@Model.ServicesPackages[i].Packages[j].Ser_Name" hidden />
                                        <h1>@Model.ServicesPackages[i].Packages[j].PkgName</h1>
                                        <p>@Model.ServicesPackages[i].Packages[j].Ser_Name PACKAGE</p>
                                    </div>
                                    <p>$@Model.ServicesPackages[i].Packages[j].TotalPrice</p>
                                    <input asp-for="@Model.ServicesPackages[i].Packages[j].TotalPrice" hidden />
                                    <input asp-for="@Model.ServicesPackages[i].Packages[j].LaunchDate" hidden />
                                </div>
                                <div class="pack-features">
                                    <div class=""></div>
                                    @foreach (var features in Model.ServicesPackages[i].Packages[j].Description)
                                    {
                                        <h2>@features</h2>
                                    }
                                </div>
                                <div class="pack-order">
                                    <div class="row-1">
                                        @{
                                            double discount = (Model.ServicesPackages[i].Packages[j].DiscountPercent / 100 * Model.ServicesPackages[i].Packages[j].TotalPrice);
                                            double PriceAfterDiscount = Model.ServicesPackages[i].Packages[j].TotalPrice - discount;

                                        }
                                        <p>SPECIAL DISCOUNT</p>
                                        <P>-$@discount</P>
                                    </div>
                                    <div class="row-2">
                                        <p>FINAL PRICE FOR LIMITED TIME</p>
                                    </div>
                                    <div class="row-3">
                                        <a asp-controller="Packages" asp-action="Detail" asp-route-id="@Model.ServicesPackages[i].Packages[j].id" target="_blank">view details</a>
                                        <h1>$@PriceAfterDiscount</h1>
                                        <input asp-for="@Model.ServicesPackages[i].Packages[j].DiscountPercent" hidden />
                                    </div>
                                    <div class="row-4">
                                        <h4>Add To Buying List</h4>
                                        <div class="input-group mb-3 order-btn-pack">
                                            <div class="input-group-prepend">
                                                <div class="input-group-text">
                                                    <input asp-for="@Model.ServicesPackages[i].Packages[j].is_selected" >
                                                </div>
                                            </div>
                                            <input asp-for="@Model.ServicesPackages[i].Packages[j].Quantity" value="1" min="1" class="form-control" >
                                        </div>

                                    </div>
                                    <div class="row-5">
                                        <p>Discuss this offer with expert</p>
                                        <div class="discuss">
                                            <p>12345467889</p>
                                            <p id="chat-btn_10">Live Chat</p>
                                        </div>
                                    </div>
                                </div>
                            </div>
                        }
                       
                    </div>
                </div>
            }
            <div>
                <button type="button" class="btn btn-danger px-2 btn-lg" onclick="PageBack(this.parentElement.parentElement)">Back</button>
                <button type="button" class="btn btn-danger px-2 btn-lg" id="summary">Summary!</button>
            </div>
        </div>
        <div class="order-summary" id="page_3">


        </div>
    </div>
</form>

@section Scripts{
    <link rel="stylesheet" href="~/css/signup.css">
    <script>
        $(document).ready(function () {
            $("#summary").click(function () {
                const packag = [];
                $('.pack1').each(function (i, pack) {
                    const obj = {};
                    const inp = $(this).find(':input');
                    let c= inp.filter('[id*="is_selected"]:checked');
                    obj['id'] = inp.filter('[id*="id"]').val();
                    obj['PkgName'] = inp.filter('[id$="PkgName"]').val();
                    obj['Ser_Id'] = inp.filter('[id$="Ser_Id"]').val();
                    obj['Ser_Name'] = inp.filter('[id$="Ser_Name"]').val();
                    obj['TotalPrice'] = inp.filter('[id$="TotalPrice"]').val();
                    obj['DiscountPercent'] = inp.filter('[id*="DiscountPercent"]').val();
                    obj['is_selected'] = c.length != 0 ? true : false;
                    obj['Quantity'] = inp.filter('[id*="Quantity"]').val();
                    packag.push(obj);
                });
                const model = {
                    cus_name: $('#cus_name').val(),
                    Country: $('#Country').val(),
                    cus_phone: $('#cus_phone').val(),
                    Email: $('#Email').val(),
                    FirstPreferences: $('#FirstPreferences').val(),
                    SecondPreferences: $('#SecondPreferences').val(),
                    FirstPreferedTimeStart: $('#FirstPreferedTimeStart').val(),
                    FirstPreferedTimeEnd: $('#FirstPreferedTimeEnd').val(),
                    SecondPreferedTimeStart: $('#SecondPreferedTimeStart').val(),
                    SecondPreferedTimeEnd: $('#SecondPreferedTimeEnd').val(),
                    Message: $('#Message').val(),
                    HoldPackage: JSON.stringify(packag)
                };

                //console.log("calling summary",model);
                //event.preventDefault();
                $.ajax({
                    type: "post",
                    url: "/Order/ShowSummary",
                    cache: false,
                    data: model,
                }).done(function (data) {
                        $('#page_2').hide();
                        $('#page_3').show();
                        $('#page_3').html(data);
                    }).catch(function ()
                    {
                        console.log("Done")
                    });

            })
            
        });

        function PageNext(ele) {
            const id = ele.getAttribute('id').split("_")[1];
            const next = parseInt(id) + 1;
            $("#col_" + id).removeClass('on');
            $("#col_" + next).addClass('on');
            $("#page_" + id).hide();
            $("#page_" + next).show();
        }
        function PageBack(ele) {
            const id = ele.getAttribute('id').split("_")[1];
            const previous = parseInt(id) - 1;
            $("#col_" + id).removeClass('on');
            $("#col_" + previous).addClass('on');
            $("#page_" + id).hide();
            $("#page_" + previous).show();
        }
    </script>
}

//My OrderView Model

 public class OrderViewModel
    {
        public OrderViewModel()
        {
            OrderPackages =new  List<OrderPackagesViewModel>();
            OrderTeam = new List<OrderTeamViewModel>();
            ServicesPackages = new List<GroupByServices>(); 
        }
        [Display(Name = "Order ID")]
        public int order_id { get; set; }

        public string Encryptedorder_id { get; set; }
        [Required]
        [DataType(DataType.Date)]
        public System.DateTime Date { get; set; }

        public int countOrder { get; set; }

        #region User's Data
        public int cus_id { get; set; }
        [Display(Name = "Customer Name")]
        [Required]
        public string cus_name { get; set; }
        [Display(Name = "Country Name")]
        public string Country { get; set; }
        [Display(Name = "Customer Phone")]
        [RegularExpression(@"^[0][1-9]\d{9}$|^[1-9]\d{9}$", ErrorMessage = "Must be Phone No")]
        [Required]
        public string cus_phone { get; set; }
        [EmailAddress]
        public string Email { get; set; }
        [Required]
        public string FirstPreferences { get; set; }
        [Required]
        public string SecondPreferences { get; set; }

        [Required]
        public TimeSpan FirstPreferedTimeStart { get; set; }
        [Required]
        public TimeSpan FirstPreferedTimeEnd { get; set; }

        public TimeSpan SecondPreferedTimeStart { get; set; }
        public TimeSpan SecondPreferedTimeEnd { get; set; } 
        #endregion

        [Display(Name = "Payment Method")]
        [Required]
        public PaymentMethods PaymentMethod { get; set; }
        [Display(Name = "Order Status")]
        public OrderStatus OrderStatus { get; set; }
        [Display(Name = "Payment Status")]
        public PaymentStatus PaymentStatus { get; set; }

        public string Message { get; set; }
        public List<OrderPackagesViewModel> OrderPackages { get; set; }


        [DataType(DataType.Date)]
        public System.DateTime StartDate { get; set; }
        [DataType(DataType.Date)]
        [Display(Name ="Expected End Date")]
        public System.DateTime EndDate { get; set; }

        public List<OrderTeamViewModel> OrderTeam { get; set; }
        public double TotalAmount { get; set; }
    

        public List<GroupByServices> ServicesPackages { get; set; }
        [Remote(action: "CheckPromo", controller: "Promo")]
        public string PromoCode { get; set; }
        
    }
Muhammad Sami
  • 520
  • 2
  • 8
  • 21

1 Answers1

0

I have reproduced your error,and i find it's caused by the data in ajax.HoldPackage: JSON.stringify(packag) should be HoldPackage: packag Here is a demo worked:

Controller:

public class OrderController : Controller
{
    public IActionResult Index()
    {
        return View();
    }
    [HttpGet]
    public IActionResult Create() {
        OrderViewModel o= new OrderViewModel();
        List<Package> list = new List<Package> { new Package { id = "1", is_selected = "true", TotalPrice = 100, DiscountPercent = 10 ,Ser_Id="1", Ser_Name= "GroupByServices1" , Description= "Description1", LaunchDate="2020/01/01", PkgName="package1", Quantity="2" } };
        o.ServicesPackages = new List<GroupByServices> { new GroupByServices { Ser_Id="1",Ser_Name= "GroupByServices1" , Packages=list} };
        return View(o);
    }
    [HttpPost]
    public IActionResult ShowSummary(CreateModel model) 
    {
        CreateModel c = model;
        OrderViewModel o = new OrderViewModel();
        List<Package> list = new List<Package> { new Package { id = "1", is_selected = "true", TotalPrice = 100, DiscountPercent = 10, Ser_Id = "1", Ser_Name = "GroupByServices1", Description = "Description1", LaunchDate = "2020/01/01", PkgName = "package1", Quantity = "2" } };
        o.ServicesPackages = new List<GroupByServices> { new GroupByServices { Ser_Id = "1", Ser_Name = "GroupByServices1", Packages = list } };
        return View("Create", o);
    }
}

CreateModel:

public class CreateModel
    {
        public string cus_name { get; set; }
        public string Country { get; set; }
        public string cus_phone { get; set; }
        public string Email { get; set; }
        public string FirstPreferences { get; set; }
        public string SecondPreferences { get; set; }
        public string FirstPreferedTimeStart { get; set; }
        public string FirstPreferedTimeEnd { get; set; }
        public string SecondPreferedTimeStart { get; set; }
        public string Message { get; set; }

        public List<Package> HoldPackage { get; set; }
    }

View:

$(document).ready(function () {
            $("#summary").click(function () {
                const packag = [];
                $('.pack1').each(function (i, pack) {
                    const obj = {};
                    const inp = $(this).find(':input');
                    let c= inp.filter('[id*="is_selected"]:checked');
                    obj['id'] = inp.filter('[id*="id"]').val();
                    obj['PkgName'] = inp.filter('[id$="PkgName"]').val();
                    obj['Ser_Id'] = inp.filter('[id$="Ser_Id"]').val();
                    obj['Ser_Name'] = inp.filter('[id$="Ser_Name"]').val();
                    obj['TotalPrice'] = inp.filter('[id$="TotalPrice"]').val();
                    obj['DiscountPercent'] = inp.filter('[id*="DiscountPercent"]').val();
                    obj['is_selected'] = c.length != 0 ? true : false;
                    obj['Quantity'] = inp.filter('[id*="Quantity"]').val();
                    packag.push(obj);
                });
                const model = {
                    cus_name: $('#cus_name').val(),
                    Country: $('#Country').val(),
                    cus_phone: $('#cus_phone').val(),
                    Email: $('#Email').val(),
                    FirstPreferences: $('#FirstPreferences').val(),
                    SecondPreferences: $('#SecondPreferences').val(),
                    FirstPreferedTimeStart: $('#FirstPreferedTimeStart').val(),
                    FirstPreferedTimeEnd: $('#FirstPreferedTimeEnd').val(),
                    SecondPreferedTimeStart: $('#SecondPreferedTimeStart').val(),
                    SecondPreferedTimeEnd: $('#SecondPreferedTimeEnd').val(),
                    Message: $('#Message').val(),
                    HoldPackage: packag
                };

                //console.log("calling summary",model);
                //event.preventDefault();
                $.ajax({
                    type: "post",
                    url: "/Order/ShowSummary",
                    cache: false,
                    data: model,
                }).done(function (data) {
                        $('#page_2').hide();
                        $('#page_3').show();
                        $('#page_3').html(data);
                    }).catch(function ()
                    {
                        console.log("Done")
                    });

            })

        });

result: enter image description here

my data format in ajax: enter image description here

Yiyi You
  • 16,875
  • 1
  • 10
  • 22
  • Sorry this is not the problem! unfortunately i tried to create the sample code with same html and same structure but i noticed that it is working in my sample project! i have spend around 4 days and tries to change every thing but it is not hitting any action method nor OrderSummary nor Create Order. The problem is some where in my application – Muhammad Sami Jul 08 '20 at 18:55
  • Maybe you can share your application or use the new project you created. – Yiyi You Jul 09 '20 at 08:40
  • it is already on github if you can help please share github username so i can add collabrator – Muhammad Sami Jul 09 '20 at 15:08
  • well i got the root cause of problem it is happening due to nested please see my #page_2 div in html currently i am solving this issue by removing asp-for tag and sending data in JSON of Complete list. however i dont know why model binding is failed in my nested list – Muhammad Sami Jul 10 '20 at 18:53
  • I think it is the data format you passed is wrong.And I hope you can update your code to newest and completely in the link rather than two links.I think whether the html is,if you can send correct data format,it will be binded correctly.And I have updated my answer with my data format. – Yiyi You Jul 14 '20 at 08:22