MVC - 在表单提交中将项目添加到模型中

时间:2015-12-02 12:26:42

标签: c# model-view-controller renderpartial

我正在尝试动态地将项目添加到列表中,并在提交后将这些项目显示在我的控制器中,但是现在我甚至没有显示现有的列表项目。

我不是100%的问题,但它似乎与为每个项目呈现的局部视图有关。

的ViewModels

public class UserGroupVM
{
    public int Id { get; set; }
    [Required]
    [Display(Name = "Usergruppe")]
    public string Name { get; set; }
    [Display(Name = "Beschreibung")]
    public string Description { get; set; }
    [Required]
    public Boolean IsGlobal { get; set; }
    public List<Employee_UserGroupVM> Employees { get; set; }
}

public class Employee_UserGroupVM
{
    public int Id { get; set; }
    [Display(Name = "Kennung")]
    public string SamAccountName { get; set; }
    [Display(Name = "Name")]
    public string LastnameFirstName { get; set; }
    [Display(Name = "Admin")]
    public bool IsAdmin { get; set; }
}

表单 - 视图:

@model DAKCrmImport.Web.Models.UserGroupVM

@{
    ViewBag.Title = "_UserGroup";
}

@using (Html.BeginForm("Save", "UserGroup", FormMethod.Post, new { Id = "form-usergroup-add", novalidate = "false" }))
{
    <fieldset>
        <div class="container-form-clear">
            <a class='button form-clear' title='Formular leeren'>button clear</a>
        </div>
        @Html.HiddenFor(model => model.Id)
        @Html.LabelFor(model => model.Name, new { @class = "label req" })
        @Html.TextBoxFor(model => model.Name, new { @class = "input"})
        @Html.LabelFor(model => model.Description, new { @class = "label" })
        @Html.TextAreaFor(model => model.Description, new { @class = "input", rows = "3", cols = "25" })
        <br />

        <a class='button form-add' title='MA-Berechtigung hinzufügen' id="bt-employee-add">button employee-add</a>
        @for (int i = 0; i < Model.Employees.Count(); i++)
        {
            @Html.EditorFor(m => m.Employees[i]);
        }

        <input type="submit" name="submit" class="submit form-button" value="Speichern" id="bt-submit-usergroup" />
    </fieldset>
}

部分视图:

@model DAKCrmImport.Web.Models.Employee_UserGroupVM

@{
    ViewBag.Title = "_EmployeeList";
}
<div class="div-employee-add">
    <div class="container-right">
        <a class="button form-remove-employee" title="MA entfernen" id="bt-employee-delete">button ma-remove</a>
    </div>
    <div class="container-left">
        @Html.LabelFor(model => model.SamAccountName)
        @Html.TextBoxFor(model => model.SamAccountName, new { @class = "textbox-samaccountname" })
        @Html.TextBoxFor(model => model.LastnameFirstName, new { @class = "textbox-lastnamefirstname", disabled = "disabled" })
        @Html.LabelFor(model => model.IsAdmin)
        @Html.CheckBoxFor(model => model.IsAdmin, new { @class = "checkbox-isadmin" })
    </div>
</div>

控制器:

public virtual ActionResult BlankEmployeeRow()
{
    return PartialView("EditorTemplates/Employee_UserGroupVM", new Employee_UserGroupVM());
}
public virtual ActionResult Save(UserGroupVM usergroup)
{
    return null;
}

到目前为止,我唯一注意到的是,如果我不使用局部视图并通过索引显示其变量,则现有项Employees会出现在控制器中。因为我不能在局部视图本身中进行任何索引,所以它现在不起作用。我不知道如何解决这个问题,无论是新的还是编辑的项目是否会出现都是值得怀疑的。

我真的很感激一点帮助。

P.S。我知道如何通过jQuery阅读模型,但我想使用MVC的原生表单提交方法,而不用其他代码。

[更新]我从部分视图中创建了一个EditorTemplate,现在existring Employees已经提交,但是其他员工仍然没有提交。即使它们出现在标记中......

通过jquery / partial view添加新项目:

$(document).on('click', '#bt-employee-add', function () {
    var lastDiv = $("[class~='div-employee-add']").first();
    var lastTextBox = $(lastDiv).find("[class~='textbox-lastnamefirstname']");

    var url = $("#EmployeeAdd").data('request-url');
    var params = null;

    if (lastTextBox.val() == "") {
        //Notification
    } else {
        $(getJSONfromController(url, params, null, true)).insertBefore($(".div-employee-add").first());
    }
});

2 个答案:

答案 0 :(得分:1)

试试这个:

@Html.Partial("_EmployeeList", Model.Employees, new ViewDataDictionary
{
    TemplateInfo = new System.Web.Mvc.TemplateInfo { HtmlFieldPrefix = "Employees" }
})

问题是部分人不知道列表的名称,所以你必须明确指定它。

答案 1 :(得分:0)

当您使用简单的ViewModel时,您的数据不会动态更新,因为您的网页不会轮询您的服务器。它只会在刷新时获得新数据。

您必须使用计时器进行投票或查看角度,淘汰或余烬。