【问题标题】:Null model with ajax post带有 ajax 帖子的空模型
【发布时间】:2017-01-10 18:59:33
【问题描述】:

我正在尝试使用 ajax 帖子将模型传递给控制器​​,但每次我这样做时,模型都是空的,并且我丢失了我试图保留的所有数据。

ajax 调用:

$('#next').click(function (e) {
    e.preventDefault();
    var url = '@Url.Action("Manage")'
    var _model = JSON.stringify(@Html.Raw(Json.Encode(Model)));
    var _page = @(Model.pager.CurrentPage + 1);

    $.ajax({
        type: "POST",
        contentType: "application/json; charset=utf-8",
        url: url,
        data: JSON.stringify({ 'model': _model, 'page': _page }),
        success: function(result) {
            console.log(result);
        }
    });
});

当我查看序列化对象时,它看起来像是一个格式正确的 JSON 对象,在开发者控制台中没有抛出任何错误。

触发这个 jQuery 调用的链接只是一个基本的操作链接:

@Html.ActionLink(">", "Manage", "Announcements", null, new { id = "next" })

我的模型有点复杂...

public class ManageViewModel : IEnumerable<EditViewModel>
{
    [Display(Name="Start Date")]
    [DataType(DataType.DateTime)]
    public DateTime? StartDate { get; set; }

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

    public string SearchString { get; set; }

    public Pager pager { get; set; }

    public List<EditViewModel> Data { get; set; }
    public List<CategoryViewModel> Categories { get; set; }

    public ManageViewModel()
    {
        Data = new List<EditViewModel>();
        Categories = new List<CategoryViewModel>();
    }

    public IEnumerator<EditViewModel> GetEnumerator()
    {
        return Data.GetEnumerator();
    }

    IEnumerator IEnumerable.GetEnumerator()
    {
        return Data.GetEnumerator();
    }
}

public class Pager
{
    public int TotalItems { get; private set; }
    public int CurrentPage { get; private set; }
    public int PageSize { get; private set; }
    public int TotalPages { get; private set; }
    public int StartPage { get; private set; }
    public int EndPage { get; private set; }

    public Pager(int totalItems, int? page, int pageSize = 10)
    {
        int totalPages = (int)Math.Ceiling((decimal)totalItems / (decimal)pageSize);
        int currentPage = page ?? 1;
        int startPage = currentPage - 5;
        int endPage = currentPage + 4;

        if(startPage <= 0)
        {
            endPage -= (startPage - 1);
            startPage = 1;
        }

        if(endPage > totalPages)
        {
            endPage = totalPages;
            if(endPage > 10)
            {
                startPage = endPage - 9;
            }
        }
        TotalItems = totalItems;
        TotalPages = totalPages;
        CurrentPage = currentPage;
        PageSize = pageSize;
        EndPage = endPage;
        StartPage = startPage;
    }
}

我无法将链接转换为表单,因为这会破坏分页。或者也许我只是不了解这里的全貌。

这是发生分页的视图部分

if (Model.pager.EndPage > 1)
{
    <div style="color:#337AB7; padding-bottom: 0px;">Page @Model.pager.CurrentPage of @Model.pager.TotalPages</div>
    <ul class="pagination">
        @if (Model.pager.CurrentPage > 1)
        {
            <li>
                @Html.ActionLink("<<", "Manage", new { model = Model, start = Model.StartDate, end = Model.EndDate, query = Model.SearchString }, null)
            </li>
            <li>
                @Html.ActionLink("<", "Manage", new { model = Model, page = Model.pager.CurrentPage - 1, start = Model.StartDate, end = Model.EndDate, query = Model.SearchString }, null)
            </li>
        }
        @for (var _page = Model.pager.StartPage; _page < Model.pager.EndPage + 1; _page++)
        {
            <li class="@(_page == Model.pager.CurrentPage ? "active" : "")">
                @Html.ActionLink(_page.ToString(), "Manage", new { model = Model, page = _page, start = Model.StartDate, end = Model.EndDate, query = Model.SearchString }, null)
            </li>
        }
        @if (Model.pager.CurrentPage < Model.pager.TotalPages)
        {
            <li> 
                @Html.ActionLink(">", "Manage", "Announcements", null, new { id = "next" })
            </li>
            <li>
                @Html.ActionLink(">>", "Manage", new { model = Model, page = Model.pager.TotalPages, start = Model.StartDate, end = Model.EndDate, query = Model.SearchString }, null)
            </li>
        }
    </ul>
}

试图传递模型的操作链接显然不起作用,但我离开了它们,因为我专注于让一个工作,即前面列出的一个,然后再配置所有其他链接。

我查看了以下 SO 帖子并没有运气:
Post an MVC model with AJAX?
Model properties null on Ajax post from list box change event
How to send a model in jQuery $.ajax() post request to MVC controller method
Pass Model To Controller using Jquery/Ajax
How to pass model in ajax post request?

关于我如何能够做到这一点的任何想法?我需要模型数据持久保存以进行通过表单完成的搜索/过滤。提前感谢您查看并提供您的见解!

【问题讨论】:

  • 你为什么要退回模型(原样)?只需发送唯一 id 即可在您的操作方法中重建模型对象。
  • 没有可供模型参考的 ID。我不是要获取特定项目,而是要保留模型中包含用于在不同页面之间导航的搜索条件的数据。
  • 您是否检查了“_model”变量和来自浏览器的请求?
  • 我做到了。 _model 变量是一个有效的 JSON 对象,我从服务器收到 200 响应。问题是模型在控制器中为空。我看到它被正确地序列化了,这是 _model JSON.stringify([{"WATypeName":"Some Value","Categories":[{"ID":6,"Name":" ... 的 sn-p 这就是它在 Fiddler 中的样子。我在开发者控制台中没有错误,请求返回正常。
  • 我还使用 JSONLint.com 验证了 JSON 对象,它是一个完全有效的对象。

标签: c# jquery ajax asp.net-mvc


【解决方案1】:

您需要为模型包含一个无参数构造函数。从您发送的屏幕截图来看,公共 Pager 模型似乎没有无参数构造函数。

【讨论】:

    猜你喜欢
    • 2016-05-01
    • 2018-11-01
    • 2021-12-13
    • 2017-07-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多