通过ajax加载partialView不起作用 [英] Loading partialView through ajax not working

查看:67
本文介绍了通过ajax加载partialView不起作用的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在尝试通过部分View和ajax显示订单摘要.请求将发送到服务器,但我的Showsummary的操作方法从未命中.我想通过局部视图来总结订单.

i am trying to show order Summary through partial View and ajax.Request is going to server but my action method of Showsummary never hits. i want to summary of order through partial view.

    [HttpPost]
    public PartialViewResult Showsummary(OrderViewModel model)
    {
        try
        {
            var p = model.Packages.SelectMany(x => x.Packages).Select(y => new OrderPackagesViewModel()
            {
                PkgName = y.PkgName,
                pkg_Id = y.id,
                Ser_Id = y.Ser_Id,
                Quantity = y.Quantity,
                price = (y.TotalPrice - (y.DiscountPercent / 100 * y.TotalPrice)) * y.Quantity
            }).ToList();
            model.OrderPackages = p;
            return PartialView("OrderSummary", model);
        }
        catch
        {
            return PartialView("OrderSummary", model);
        }
    }

我的Ajax

    $("#summary").click(function () {
            console.log("calling summary");
            event.preventDefault();
            $.ajax({
                type: "POST",
                url: "/Order/Showsummary",
                data: $("form.signup-form").serialize(),
                success: function (data) {
                    console.log(data)
                    $('#page_2').hide();
                    $('#page_3').show();
                    $('#page_3').html(data);
                },
                failure: function (response) {
                    console.log(response.responseText);
                },
                error: function (response) {
                    console.log(response.responseText);
                }
            });

        })

//HTML代码

<div id="page_1">
            <input asp-for="cus_name" placeholder="First Name" >
            <input asp-for="Email" placeholder="Email" >
            <select asp-for="Country" class="ui search dropdown">
                                        <option value="">Select Country</option>
                                        <option value="AF">Afghanistan</option>
                                        <option value="AX">Åland Islands</option>
            </select>
            <input asp-for="cus_phone"  placeholder="Phone Number"/>
            <select asp-for="FirstPreferences" class="custom-select mr-sm-2"
                         asp-items="@(newSelectList(Preferences))">
                             <option value="">Select</option>
            </select>
            <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>
            </select>
           <textarea asp-for="Message" class="form-control"> </textarea>
    </div>

//Page2可用软件包的详细信息.它是GroupByServices的列表,其中包含字段ser_id Ser_Name和ServicePackages列表.

//Page2 details of packages available. It is list of GroupByServices which contain fields ser_id Ser_Name and List of ServicePackages.

<div id="page_2" style="display:none">
            <div>
                <h1 id="heading">Choose a Package!</h1>
            </div>
            <div class="buttons">
                @foreach (var services in Model.Packages)
                {
                    <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.Packages.Count; i++)
            {
    
          <div class="packages" id="service_@Model.Packages[i].Ser_Id">
              <h1 id="custom-website-design">
                        @Model.Packages[i].Ser_Name    
              </h1>
              <div class="packs-content">
    
                   @for (int j = 0; j < Model.Packages[i].Packages.Count(); j++)
                   {    
                     <div class="pack1">
                          <div class="pack-price">
                              <div>
                                <input asp-for="@Model.Packages[i].Packages[j].id" hidden />
                                <input asp-for="@Model.Packages[i].Packages[j].PkgName" hidden />
                                <input asp-for="@Model.Packages[i].Packages[j].Ser_Id" hidden />
                                 <input asp-for="@Model.Packages[i].Packages[j].Ser_Name" hidden />
                                        
                   <h1>@Model.Packages[i].Packages[j].PkgName</h1>
                                        
                    <p>@Model.Packages[i].Packages[j].Ser_Name PACKAGE</p>
              </div>
                                    
             <p>$@Model.Packages[i].Packages[j].TotalPrice</p>
             <input asp-for="@Model.Packages[i].Packages[j].TotalPrice" hidden />
        </div>
                                <div class="pack-features">
                                    <div class=""></div>
                                    @foreach (var features in Model.Packages[i].Packages[j].Description)
                                    {
                                        <h2>@features</h2>
                                    }
                                </div>
                                <div class="pack-order">
                                    <div class="row-1">
                                        @{
                                            double discount = (Model.Packages[i].Packages[j].DiscountPercent / 100 * Model.Packages[i].Packages[j].TotalPrice);
                                            double PriceAfterDiscount = Model.Packages[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.Packages[i].Packages[j].id" target="_blank">view details</a>
                                        <h1>$@PriceAfterDiscount</h1>
                                        <input asp-for="@Model.Packages[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.Packages[i].Packages[j].is_selected" aria-label="Checkbox for following text input">
                                                </div>
                                            </div>
                                            <input asp-for="@Model.Packages[i].Packages[j].Quantity" value="1" min="1" required placeholder="Quantity" class="form-control" aria-label="Text input with checkbox">
                                        </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>
                        }
                        <input asp-for="HoldPackage" hidden/>
                    </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>

编辑!!!!我已经在ajax中更改了此行,现在它开始命中我的控制器操作,但是仍然所有表单值都是空的,似乎模型绑定无法识别我的字段

Edit!!!! i have changed this line in ajax now it start hitting my controller action but still all form values are empty seems model binding is unable to recognize my fields

 **const model= $("form").serialize()**
   console.log(model); //data is there thats fine

和在ajax中
数据:{模型},我的模型有一个称为包"的字段,它是一些字段的列表,并且在其中有另一个列表.

and in ajax
data: { model }, my model have field called packages which is list of some fields and inside it there is one another list.

一件事很清楚.$("form").serialize()在我的情况下无法正常工作,它给了我 415不支持的媒体类型客户端错误响应.我认为问题是由于嵌套列表所致

One thing is clear. $("form").serialize() is not working in my case its giving me 415 Unsupported Media Type client error response. I think problem is due to nested List

推荐答案

我已经用一个简单的OrderViewModel对象检查了您的代码,它运行良好.我建议您可以尝试在操作方法中添加"[FromBody]",如下所示:
....

修改

根据您的描述,似乎您使用的是嵌套列表,并且在使用[FromBody]时遇到415错误.我已经修改了示例代码,在action方法中,它没有使用[FromBody]属性,在JQuery Ajax方法中,不需要使用JSON.stringify方法来更改JavaScript对象.更多详细信息,请检查以下代码:

According your description, it seems that you are using the Nested List and meet 415 error when using the [FromBody]. I have modified the sample code, in the action method, it's not using the [FromBody] attribute and in the JQuery Ajax method, there is no need to use the JSON.stringify method to change the JavaScript object. More detail information, please check the following code:

模型类(假设OrderViewModel包含一个列表):

Model Class (Suppose the OrderViewModel contain a List):

public class OrderViewModel
{
    public int OrderId { get; set; }
    public string OrderName { get; set; }

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

public class Package
{
    public int Pid { get; set; }
    public string PackageTitle { get; set; }
}

控制器中的代码:

    /// <summary>
    /// //display the order
    /// </summary>
    /// <returns></returns>
    public IActionResult ShowOrder()
    {
        OrderViewModel ovm = new OrderViewModel()
        {
            OrderId = 1001,
            OrderName = "order 1",
            Packages = new List<Package>()
            {
                new Package(){ Pid=101, PackageTitle="first Package"},
                new Package(){ Pid=102, PackageTitle="second package"}
            }

        };
        return View(ovm);
    }

    /// <summary>
    /// JQuery ajax post method 
    /// </summary>
    /// <param name="model"></param>
    /// <returns></returns>
    [HttpPost]
    public PartialViewResult Showsummary(OrderViewModel model)
    {
        try
        {
            //...
            return PartialView("OrderSummary", model);
        }
        catch
        {
            return PartialView("OrderSummary", model);
        }
    }

ShowOrder.cshtml:

ShowOrder.cshtml:

@model MVCSample.Models.OrderViewModel

@{
    ViewData["Title"] = "ShowOrder";
}
 
<div class="row">
    <div class="col-md-4">
        <form asp-action="Showsummary" asp-controller="Home" method="post" class="signup-form">
            <div asp-validation-summary="ModelOnly" class="text-danger"></div>
            <div class="form-group">
                <label asp-for="OrderId" class="control-label"></label>
                <input asp-for="OrderId" class="form-control" />
                <span asp-validation-for="OrderId" class="text-danger"></span>
            </div>
            <div class="form-group">
                <label asp-for="OrderName" class="control-label"></label>
                <input asp-for="OrderName" class="form-control" />
                <span asp-validation-for="OrderName" class="text-danger"></span>
            </div>
            <div id="packages">

                @for (int i = 0; i < Model.Packages.Count; i++)
                {
                <div class="form-group">
                    <label asp-for="@Model.Packages[i].Pid" class="control-label"></label>
                    <input asp-for="@Model.Packages[i].Pid" class="form-control" />
                    <span asp-validation-for="@Model.Packages[i].Pid" class="text-danger"></span>
                    <br />
                    <label asp-for="@Model.Packages[i].PackageTitle" class="control-label"></label>
                    <input asp-for="@Model.Packages[i].PackageTitle" class="form-control" />
                    <span asp-validation-for="@Model.Packages[i].PackageTitle" class="text-danger"></span>
                </div> 
                }

            </div>
            @*<div class="form-group">
            <input type="submit" value="Create" class="btn btn-primary" />
        </div>*@
        </form>
    </div>
</div>
<div>
    <input type="button" id="summary" value="Summary" />
    <div id="page_3">
    </div>
</div>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.5.1/jquery.min.js"></script>
<script>
    $(function () {
        $("#summary").click(function () {
            console.log("calling summary");
            event.preventDefault();
            //create a object to store the entered value.
            var OrderViewModel = {};
            //using jquery to get the entered value.
            OrderViewModel.OrderId = $("input[name='OrderId']").val();
            OrderViewModel.OrderName = $("input[name='OrderName']").val();

            var packages = []; 
            //var count = $("#packages>.form-group").length; //you could use it to check the package count            
            $("#packages>.form-group").each(function (index, item) {
                var package = {}
                package.Pid = $(item).find("input[name='Packages[" + index + "].Pid']").val();
                package.PackageTitle = $(item).find("input[name='Packages[" + index + "].PackageTitle']").val();
                packages.push(package);
            });
            OrderViewModel.Packages = packages;

            $.ajax({
                type: "POST",
                url: "/Home/Showsummary",  //remember change the controller to your owns. 
                data: OrderViewModel,  
                success: function (data) {
                    console.log(data)
                    $('#page_3').html(data);
                },
                failure: function (response) {
                    console.log(response.responseText);
                },
                error: function (response) {
                    console.log(response.responseText);
                }
            });

        });
    });
</script>

然后输出如下:

此外,我还发现通过使用以上示例,如果我只是将 data:OrderViewModel 更改为 data:$("form.signup-form").serialize((在Ajax方法中),我也可以在action方法中获得OrderViewModel和Packages.

Besides, I also found that by using the above sample, if I just change the data: OrderViewModel to data: $("form.signup-form").serialize() (in the Ajax method), I could also get the OrderViewModel and the Packages in the action method.

这篇关于通过ajax加载partialView不起作用的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

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