MVC - 在表单提交时将项目添加到模型中的列表
MVC - Adding Item to List in Model on form-submit
我正在尝试将项目动态添加到列表中,并在提交后让这些项目显示在我的控制器中,但现在我什至没有让现有的列表项目显示出来。
我不是 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,现在现有的员工已提交,但其他员工仍未提交。即使它们出现在标记中...
通过 jquery/partial 视图添加新项目:
$(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());
}
});
试试这个:
@Html.Partial("_EmployeeList", Model.Employees, new ViewDataDictionary
{
TemplateInfo = new System.Web.Mvc.TemplateInfo { HtmlFieldPrefix = "Employees" }
})
问题是部分不知道列表的名称,因此您必须明确指定它。
当您使用简单的 ViewModel 时,您的数据不会动态更新,因为您的页面不会轮询您的服务器。它只会在刷新时获取新数据。
您要么必须使用计时器进行轮询,要么调查 angular、淘汰赛或 ember。
我正在尝试将项目动态添加到列表中,并在提交后让这些项目显示在我的控制器中,但现在我什至没有让现有的列表项目显示出来。
我不是 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,现在现有的员工已提交,但其他员工仍未提交。即使它们出现在标记中...
通过 jquery/partial 视图添加新项目:
$(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());
}
});
试试这个:
@Html.Partial("_EmployeeList", Model.Employees, new ViewDataDictionary
{
TemplateInfo = new System.Web.Mvc.TemplateInfo { HtmlFieldPrefix = "Employees" }
})
问题是部分不知道列表的名称,因此您必须明确指定它。
当您使用简单的 ViewModel 时,您的数据不会动态更新,因为您的页面不会轮询您的服务器。它只会在刷新时获取新数据。
您要么必须使用计时器进行轮询,要么调查 angular、淘汰赛或 ember。