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

时间:2017-02-08 13:20:54

标签: jquery ajax asp.net-mvc razor

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

我有一个带有少量字段的模态对话框的视图,并且提交了一个附加了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中也是好的。(对不起,不是母语为英语的人)

1 个答案:

答案 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 /编辑器模板”。

感谢大家提供帮助。