我不允许发布整个代码,所以请从提供的代码片段中获取帮助....
我有一个带有少量字段的模态对话框的视图,并且提交了一个附加了Click事件处理程序的按钮。点击处理程序如下所示:
var gosti = [];
$("#modalDodajGosta").on("click","#btnDodajGosta",function(){
var $modalForm = ($("#modalDodajGosta form"));
if($modalForm.valid())
{
var gost = getFormData2Object($modalForm);
if(gost != undefined)
{
gosti.push({
Id : parseInt(gost.Id),
ImePrezime : gost.ImePrezime,
DrzavaId : parseInt(gost.DrzavaId),
Email : gost.Email,
Telefon : gost.Telefon
});
}
$.ajax({
url:"@Url.Action("GenerisiListuGostiju", "Gosti")",
data:$.toJSON(gosti),
contentType: "application/json; charset=utf-8",
dataType: "html",
type:"post",
success: function(data)
{
console.log("Success!!!");
alert(data);
},
error:function(){ console.log("Connection Error!!!");}
});
}
这应该发送对象数组并返回html(局部视图)。接下来是......
[HttpPost]
public ActionResult GenerisiListuGostiju(List<GostiStavka> gosti)
{
return PartialView("~/Views/Rezervacije/Partials/_GostDisplayTemplate.cshtml", gosti);
}
此时一切正常,发送数组被识别为ViewModel列表(或任何你想要调用它们的DTO)但返回的PartialView与当前ajax设置一样返回,如果&#34; dataType&#则返回0 34;被设置为&#34; json&#34; ....所以没有html - 没有局部视图。部分视图看起来像这样......
@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>
EditorFor是一个自定义的EditorTemplate,通过直接调用它并发送适当的对象列表进行测试,响应符合预期。我需要这个编辑器模板,因为我想使用其输入元素的正确绑定功能来建模。 &#39;名称=&#34; GostiStavka [0] .ID&#34;&#39;
我也尝试返回json,但我需要将PartialView转换为字符串。在堆栈溢出时发现了几个解决方案,但最多它们返回了一个字符串,如&#34; 0 \ r \ n \ r \ n&#34;好像他们无法解析编辑器并只返回行/行转义字符....
我以前使用的解决方案涉及通过&#34; javascript&#34;来管理这些名称。但这似乎再次发明了轮子,因为MVC5编辑器模板可以为你做到这一点。
有关制作此作品的任何想法都表示赞赏。此外,想要在提交时将项目动态添加到ViewModel列表中的新想法,而不事先将它们添加到DB中也是好的。(对不起,不是母语为英语的人)
答案 0 :(得分:1)
我自己解决了这个问题,所以我就是这样做的:
将传入模型从IEnumerable更改为ProjectName.ViewModels.RezervacijeKreirajVM,因为我想在主视图中保留列表绑定的正确名称:
@model ProjectName.ViewModels.RezervacijeKreirajVM
<ul id="lista-gostiju" class="list-group">
@Html.EditoFor(m => m.GostiStavka)
</ul>
这是我最大的错误!
MVC正在使用命名约定,因此如果请求的编辑器不是来自Views / Named / EditorTemplate所在的同一NamedController,则默认情况下无法访问它。
所以我把我的内部放在共享文件夹中只是为了测试它没有问题。
这在我之前没有发生,因为当我在主视图中测试编辑器时一切正常,因为编辑器位于Main View文件夹内,例如。 “视图/ MainView /编辑器模板”。
感谢大家提供帮助。