Jquery 如何使用ajax()将对象数组发送到控制器,并在MVC5中接收部分视图或视图
我不允许发布整个代码,所以请从提供的代码片段中帮助我 我有一个视图,它有一个模态对话框,其中只有几个字段,还有一个submit按钮,它附带了一个Click事件处理程序。单击处理程序如下所示: 模式提交/单击处理程序 这将发送对象数组并返回html(部分视图)。接下来是 控制器动作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
[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>