如何将<model>的集合从视图传递到.net mvc

时间:2018-10-14 19:26:12

标签: json ajax asp.net-mvc arraylist web-development-server

感谢您抽出时间阅读我的问题...。 解决方案不必与ajax一起使用...我需要任何使该工作如所描述的那样。...

我需要执行以下操作 Image for the site 如果我从广告类型中选择私家车,则仅显示私家车;如果我选择 BMW ,则仅显示BMW,依此类推。 ..我做到了..

问题是当我尝试合并多个搜索参数时

示例:如果我只需要显示特定城市中的宝马二手车,然后按价格或里程等对结果进行排序...... < / p>

我没有做到这一点...我试图每次都将结果包装为一个列表,然后通过ajax将此列表传递给控制器​​以执行操作,然后在局部视图中检索它...但是我无法通过此列表(列表(UserCar类))…… 我认为,如果一个慷慨的人引导我正确地进行排序,那么所有搜索参数都将相同...

这是一个视图模型,其中包含usercar模型,该模型具有我要从数据库检索的所有数据

public class VMUserCar
{
    public UserCar UserCar { get; set; }
    public IEnumerable<UserCar> CarsList { get; set; }
    public int? CarsListCount{ get { return CarsList.Count(); } }
}

这是包含部分视图的索引

<div class="searchDiv">
@Html.Partial("~/Views/Partial_Views/_DisplayAds/_SearchResultDisplay.cshtml")
 </div>

这是局部视图,它显示了上面站点图像中显示的所有userCars(我尽可能删除了html以减少干扰)

@model CarSales.Models.CarsForSale.VMUserCar

@foreach (var item in Model.CarsList)
{
 @item.Year  @item.Make  @item.Model @item.Badge @item.BodyStyle 
 @item.DriveType   --&& Other stuff--
}

   @*SortBy (in the same view)*@
<script>
    $(document).ready(function () {
        var SortDD = $('#SortDD');
        var searchDiv = $('.searchDiv');
       
        var carsList = '@Html.Raw(Json.Encode(Model.CarsList))';
        //var carsList1 = JSON.stringify(carsList);
        console.log("List: " + carsList);

      SortDD.change(function () {
            $.ajax({
                //processData: false,
                traditional: true,
                dataType: 'html',
                contentType: 'application/json; charset=utf-8',
                data: { list: carsList,searchValue: SortDD.val() },
                url: '@Url.Action("SortSearch", "DisplayAds")',
                type: 'post',
                success: function (response) {
                    searchDiv.empty();
                    if (response !== null) {
                        searchDiv.append(response);
                    } else {
                        searchDiv.append("Search returns null from sort DD");
                    }
                },
                error: function (ex) {
                    alert("Error from sort DD:  ", ex.statusText);
                }
            });
        });
    });
     </script>

这是将接收ajax的控制器

[HttpPost]
    public PartialViewResult SortSearch(string searchValue, IEnumerable<UserCar> list)
    {

        ViewBag.SortDD = new SelectList(Utilties.GetSortDD(), "Value", "Text", searchValue);

        switch (searchValue)
        {
            case "1":
                list = list.OrderByDescending(x => x.AdCreationDate).ToList();
                break;

            case "2":
          list = list.OrderByDescending(x => x.Odometer).ToList();
                break;

            case "3":
               list = list.OrderBy(x => x.Make).ToList();
                break;
          --& other 10 cases--

   var vmUserCar = new VMUserCar() { CarsList = list};

        return PartialView("~/Views/Partial_Views/_DisplayAds/_SearchResultDisplay.cshtml",  vmUserCar );
    } --this is the same partial view which displays all the userCars --

当我运行并且ajax包含以下内容时:     contentType:'application / json; charset = utf-8', 它给我“无效的JSON原语:list1。”并且不会继续采取行动...

&当我不带它运行时,它会起作用,但控制器上的列表值始终为空。 我单独尝试了“ @ Html.Raw(Json.Encode(Model.CarsList))”,并且值始终为null,但是当我进行console.log记录时。...我得到json值。

和JSON.stringify(carsList)也为null,但是当我在控制台上登录时根本没有值...

当我将控制器的列表值更改为IEnumerable list 它以一个长字符串行的形式检索值,但我不知道如何将其转换为UserCar类

再次感谢您抽出宝贵的时间阅读所有内容...任何帮助将不胜感激。...

1 个答案:

答案 0 :(得分:0)

      $(document).ready(function () { 
       function PassThings()
       {              
           var things = [
               { id: 1, color: 'yellow' },
               { id: 2, color: 'blue' },
               { id: 3, color: 'red' }
           ];

           things = JSON.stringify({ 'things': things });

           $.ajax({
               contentType: 'application/json; charset=utf-8',
               dataType: 'json',
               type: 'POST',
               url: $("body").attr("data-project-root") + "Administration/Actions/PassThings",
               data: things,
               success: function () {
                   $('#result').html('"PassThings()" successfully called.');
               },
               failure: function (response) {
                   $('#result').html(response);
               }
           }); 
       }
       PassThings();
   });

对于此控制器::

   public void PassThings(List<Thing> things)
    {
        var t = things;
    }

对于此ViewModel ::

public class Thing
{
    public int Id { get; set; }
    public string Color { get; set; }
}

它必须可以工作,我对此进行了重新检查。请您重新检查一次。