操作方法未命中-模型绑定失败 [英] Action Method not hitting - Model binding failed

查看:69
本文介绍了操作方法未命中-模型绑定失败的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在尝试提交表单,但没有击中我的后处理方法.我也通过ajax加载局部视图,但是无论我在哪里传递orderViewModel,它都停止工作.我也尝试过使用[FromBody]之类的Create([FromBody] OrderViewModel模型),它给我415错误.

我的Ajax数据格式:

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; }
        
    }

解决方案

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:

my data format in ajax:

这篇关于操作方法未命中-模型绑定失败的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆