【发布时间】:2017-02-08 13:20:53
【问题描述】:
我不允许发布整个代码,所以请帮助您从提供的 sn-ps 中获得什么......
我有一个带有几个字段的模式对话框的视图和一个附加了 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 设置中返回为空,如果“dataType”设置为 0,则返回“json”....所以没有 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,通过直接调用它并发送适当的对象列表进行测试,并且响应符合预期。我需要这个编辑器模板,因为我想使用它的输入元素正确绑定的特性来建模,例如。 'name="GostiStavka[0].Id"'.
我也尝试返回 json,但我需要一些东西来将 PartialView 转换为字符串。在这里找到了几个关于堆栈溢出的解决方案,但充其量他们返回了一个类似 "0\r\n\r\n" 的字符串,就好像他们无法解析编辑器并且只返回行/行转义字符....
我之前有效的解决方案涉及通过“javascript”管理这些名称,但这似乎又是在发明轮子,因为 MVC5 编辑器模板可以为您做到这一点。
对制作这项工作的任何想法表示赞赏。此外,在提交时将项目动态添加到 ViewModel 的特定类型列表而不事先将它们添加到 DB 的新想法也很好。(对不起,不是以英语为母语的人)
【问题讨论】:
-
看起来这种情况不需要首先将视图转换为字符串,因为您只对视图的 html 感兴趣。如果您需要操作该字符串或将其返回 with 其他内容(例如成功标志 json),您将转换为字符串。返回
PartialView()已经作为字符串返回。 -
如果您将局部视图更改为基本的东西,例如
<h1>Success</h1>,会发生什么 - 有效吗?如果是这样,那么传递给它的部分和/或数据将是一个问题。当您的操作被点击时,gosti是否包含填充模型? (不仅仅是一个模型列表,这些模型的值是否正确分配?) -
我正要提出同样的建议。部分看起来会导致 500。您的模型是
IEnumerable,它没有名为GostiStavka的成员。如果该成员在您的GostiStavka类上,那么您需要先迭代模型,然后再调用EditorFor。 -
好的,我明白你们在说什么......让我试试
标签: jquery ajax asp.net-mvc razor