Jquery 如何使用ajax()将对象数组发送到控制器,并在MVC5中接收部分视图或视图

Jquery 如何使用ajax()将对象数组发送到控制器,并在MVC5中接收部分视图或视图,jquery,ajax,asp.net-mvc,razor,Jquery,Ajax,Asp.net Mvc,Razor,我不允许发布整个代码,所以请从提供的代码片段中帮助我 我有一个视图,它有一个模态对话框,其中只有几个字段,还有一个submit按钮,它附带了一个Click事件处理程序。单击处理程序如下所示: 模式提交/单击处理程序 这将发送对象数组并返回html(部分视图)。接下来是 控制器动作 [HttpPost] 公共行动结果生成列表(列表gosti) { 返回PartialView(“~/Views/Rezervacije/Partials/_gostdisplaytemplay.cshtml”,gost

我不允许发布整个代码,所以请从提供的代码片段中帮助我

我有一个视图,它有一个模态对话框,其中只有几个字段,还有一个submit按钮,它附带了一个Click事件处理程序。单击处理程序如下所示:

模式提交/单击处理程序 这将发送对象数组并返回html(部分视图)。接下来是

控制器动作
[HttpPost]
公共行动结果生成列表(列表gosti)
{
返回PartialView(“~/Views/Rezervacije/Partials/_gostdisplaytemplay.cshtml”,gosti);
}
此时一切正常,发送的数组被识别为ViewModels列表(或DTO,无论您想叫它们什么),但返回PartialView在当前ajax设置下返回为nothing,如果“dataType”设置为“json”,则返回为0。。。。所以没有html-没有局部视图。局部视图看起来像这样

局部视图
@model IEnumerable
    @EditoFor(m=>m.GostiStavka)
更新 编辑器模板
@model ProjectName.ViewModels.GostiStavka
  • @Model.ImePrezime @HiddenFor(m=>m.Id,新的{@class=“force val”}) @HiddenFor(m=>m.ImePrezime,新的{@class=“force val”}) @HiddenFor(m=>m.DrzavaId,新的{@class=“force val”}) @Html.HiddenFor(m=>m.Email,新的{@class=“force val”}) @HiddenFor(m=>m.Telefon,new{@class=“force val”}) @Html.ValidationMessageFor(m=>m.Id) @Html.ValidationMessageFor(m=>m.ImePrezime) @Html.ValidationMessageFor(m=>m.DrzavaId) @Html.ValidationMessageFor(m=>m.Email) @Html.ValidationMessageFor(m=>m.Telefon)
  • EditorFor是一个定制的EditorTemplate,通过直接调用它并发送适当的对象列表进行测试,响应符合预期。我需要这个编辑器模板,因为我想使用它的功能,将输入元素正确绑定到模型,例如“name=”GostiStavka[0].Id“

    我也尝试返回json,但我需要一些东西将PartialView转换为字符串。在这里找到了两个关于堆栈溢出的解决方案,但充其量它们返回一个类似“0\r\n\r\n”的字符串,好像它们无法解析编辑器,只返回行/行转义字符

    我以前的解决方案是通过“javascript”来管理这些名称,但这似乎是又一次发明轮子,因为MVC5编辑器模板可以为您做到这一点


    任何关于使这项工作的想法都将不胜感激。另外,在提交时动态将特定类型的项目添加到列表中,而不事先将其添加到DB中的新想法也很好。(对不起,不是英语母语人士)

    我自己解决了这个问题,下面是我的做法:

    局部视图 将传入模型从IEnumerable更改为ProjectName.ViewModels.RezervacijeKreirajVM,因为我希望在主视图中保留列表绑定的正确名称:

    @model ProjectName.ViewModels.RezervacijeKreirajVM
    <ul id="lista-gostiju" class="list-group">
        @Html.EditoFor(m => m.GostiStavka)
    </ul>
    
    @model ProjectName.ViewModels.RezervacijeKreirajVM
    
      @EditoFor(m=>m.GostiStavka)
    编辑器模板位置 这是我最大的错误

    MVC正在使用命名约定,因此如果请求的编辑器不是来自Views/Named/EditorTemplate所在的同一个NamedController,则默认情况下无法访问该编辑器

    所以我把我的放在共享文件夹里,只是为了测试一个没有问题的工作系统

    我以前没有想到这一点,因为当我在主视图中测试编辑器时,一切正常,因为编辑器位于主视图文件夹中,例如“Views/MainView/editor Templates”


    感谢大家提供的帮助。

    Check看起来并不保证首先将视图转换为字符串,因为您只对视图的html感兴趣。如果需要操作字符串或返回其他内容(如成功标志json),则需要转换为字符串。返回的
    PartialView()
    已作为字符串返回。如果将部分视图更改为基本视图(如
    Success
    ),会发生什么情况?这样做有效吗?如果是这样,那么传递给它的部分和/或数据就会有问题。当您的操作被点击时,
    gosti
    是否包含填充的模型?(不仅仅是一个模型列表,而且这些模型的赋值是否正确?)。这个部分看起来会导致500人死亡。您的模型是一个
    IEnumerable
    ,它没有名为
    GostiStavka
    的成员。如果该成员在您的
    GostiStavka
    类中,那么您需要先迭代模型,然后再调用
    EditorFor
    。好的,我明白你们的意思了……让我试试
    [HttpPost]
    public ActionResult GenerisiListuGostiju(List<GostiStavka> gosti)
    {
        return PartialView("~/Views/Rezervacije/Partials/_GostDisplayTemplate.cshtml", gosti);
    }
    
    @model IEnumerable<ProjectName.ViewModels.GostiStavka>
    <ul id="lista-gostiju" class="list-group">
        @Html.EditoFor(m => m.GostiStavka)
    </ul>
    
    @model ProjectName.ViewModels.GostiStavka
    <li class="gost-item">
    <a href="#" class="btn btn-default btn-sm item-btn-left remove-item"><i class="fa fa-remove"></i></a>
    <a href="#" class="btn btn-default btn-sm item-btn-right edit-item"><i class="fa fa-pencil"></i></a>
    <div class="col-xs-5">@Model.ImePrezime</div>
    <div class="col-xs-7">
        <a href="mailto:@Model.Email" class="">@Model.Email</a>
    </div>
    <div class="clearfix"></div>
    
    <div class="form-items">
        @Html.HiddenFor(m => m.Id, new { @class="force-val" })
        @Html.HiddenFor(m => m.ImePrezime, new { @class = "force-val" })
        @Html.HiddenFor(m => m.DrzavaId, new { @class = "force-val" })
        @Html.HiddenFor(m => m.Email, new { @class = "force-val" })
        @Html.HiddenFor(m => m.Telefon, new { @class = "force-val" })
    </div>
    <div class="field-validation-error">
        @Html.ValidationMessageFor(m => m.Id)
        @Html.ValidationMessageFor(m => m.ImePrezime)
        @Html.ValidationMessageFor(m => m.DrzavaId)
        @Html.ValidationMessageFor(m => m.Email)
        @Html.ValidationMessageFor(m => m.Telefon)
    </div>
    
    @model ProjectName.ViewModels.RezervacijeKreirajVM
    <ul id="lista-gostiju" class="list-group">
        @Html.EditoFor(m => m.GostiStavka)
    </ul>