从视图中返回一组模型

时间:2014-07-01 07:01:21

标签: c# asp.net-mvc asp.net-mvc-5

我需要在Razor View中动态创建对象,并在用户编辑后将其提交回服务器。
这就是我的模型的样子:

public class Panel
{
    public string Name { get; set; }
    public string Text1 { get; set; }
    public string Text2 { get; set; }
}

我想要做的是每次使用Javascript点击按钮时呈现所需的输入。这就是我的主要观点:

@model IEnumerable<TabsTest.Models.Panel>

@using (Html.BeginForm())
{
@Html.AntiForgeryToken()

<div class="form-horizontal">
    @for (int i = 0; i < ViewBag.I; i++)
    {

        @*@Html.Partial("_view", new TabsTest.Models.Panel() { Name = "A" + i })*@
        @Html.Action("PanelSub", "Panels", new { name = i })
        <hr />
    }
    <div class="form-group">
            <div class="col-md-offset-2 col-md-10">
                <input type="submit" value="Create" class="btn btn-default" />
            </div>
        </div>
</div>
}

PartialView

@model TabsTest.Models.Panel
@Html.EditorFor(model => model.Name, new { htmlAttributes = new { @class = "form-control" } })
@Html.EditorFor(model => model.Text1, new { htmlAttributes = new { @class = "form-control" } })
@Html.EditorFor(model => model.Text2, new { htmlAttributes = new { @class = "form-control" } })

我的行动:

    public ActionResult CreatePanels()
    {
        ViewBag.I = 5;
        return View();
    }

    [HttpPost]
    public ActionResult CreatePanels(IEnumerable<Panel> panels) // <= always returns Null
    {
        //handle collection...
        return RedirectToAction("Index");
    }

    public PartialViewResult PanelSub(int name = -1)
    {
        var panel = new Panel() { Name = name.ToString() };
        return PartialView("_view");
    }

我的问题是如何使用模型绑定来处理用户在视图中创建的新对象?

2 个答案:

答案 0 :(得分:0)

您可以创建一组虚拟输入,当您单击“添加”面板时,克隆并显示这些输入。按钮(假设您要将新面板添加到ID =&#39;#Panels&#39;的div)

<div id="NewPanel" style="display:none">
  <div class='panelContainer'>
    <input type="text" name="panel[#].Name" value />
    <input type="text" name="panel[#].Text1" value />
    <input type="text" name="panel[#].Text2" value />
    <input type="hidden" name="panel[#].Index" value ="%"/>
  </div>
</div>

请注意使用虚拟索引器来防止将其重新发布回来

脚本

$('#AddButton').click(function() {
  var index = $('#Panels').children('.panelContainer').length; // count of existing panels
  var clone = $('#NewPanel').clone();
  // Update the index of the clone
  clone.html($(clone).html().replace(/\[#\]/g, '[' + index + ']'));
  clone.html($(clone).html().replace(/"%"/g, '"' + index  + '"'));
  $('#Panels').append(clone);
}

请注意,您不需要使用此解决方案的部分视图

答案 1 :(得分:0)

这就是我的方法:我使用了knockoutjs和AJAX。我从服务器那里得到了一个集合。我通过AJAX检索了这个集合并填充了淘汰视图模型。在视图中,我实现了添加新项目。当我添加一个新项目时:

  1. 该项目已添加到ko viewmodel
  2. 该项目通过ajax发送到要保存的服务器