【发布时间】:2016-03-17 18:13:43
【问题描述】:
我在一个视图表单中有 3 个控件(一个文本框、一个数字框和一个日期),这 3 个构成了模型对象。有提供给用户的链接,单击此链接时,所有 3 个控件在表单内重复 5 次。
我有一个模型类列表作为控制器操作方法中的参数类型。如何克隆表单内容 5 次以使其正确序列化到列表?
【问题讨论】:
标签: javascript c# jquery .net asp.net-mvc
我在一个视图表单中有 3 个控件(一个文本框、一个数字框和一个日期),这 3 个构成了模型对象。有提供给用户的链接,单击此链接时,所有 3 个控件在表单内重复 5 次。
我有一个模型类列表作为控制器操作方法中的参数类型。如何克隆表单内容 5 次以使其正确序列化到列表?
【问题讨论】:
标签: javascript c# jquery .net asp.net-mvc
当用户单击“添加”按钮时,您应该使用 jQuery 动态创建包含所有 3 个输入字段的行。
因此,在您的 razor 视图(例如:Create)中,使用三个表单字段创建第一行。
@using (Html.BeginForm())
{
<a href="#" id="addRow">Add</a>
<div id="items">
<div class="itemRow">
<label>Name</label> <input type="text" class="formfield" name="Name" />
<label>Age</label> <input type="text" class="formfield" name="Age" />
<label>CreateDate</label><input type="text" class="formfield" name="CreateDate" />
</div>
</div>
<input type="submit" id="btnSubmit" />
}
现在我们将添加一些客户端代码来监听 Add 链接上的 click 事件,创建容器 div 的克隆(带有 css 类 itemRow)并将其附加到外部容器 div(带有 id items)。当用户单击提交按钮时,我们将读取表单字段并构建一个对象数组并使用 jQuery ajax 将其发布到服务器。
@section Scripts
{
<script type="text/javascript">
$(function () {
$("#addRow").click(function (e) {
e.preventDefault();
var template = $("#items").find(".itemRow").first();
var newRow = template.clone();
newRow.find("input.formfield").val("");
$("#items").append(newRow);
});
$("#btnSubmit").click(function (e) {
e.preventDefault();
var _this = $(this);
var url =_this.closest("form").attr("action");
var rows = [];
var items = $(".itemRow");
$.each(items, function (i, item) {
var name = $(item).find("input[name='Name']").val();
var age = $(item).find("input[name='Age']").val();
var createDt = $(item).find("input[name='CreateDate']").val();
var row = { Name: name, Age: age, CreateDate: createDt };
rows.push(row);
});
//Let's post to server
$.ajax({
type:"POST",
url: url,
data: JSON.stringify(rows),
contentType: "application/json"
})
.done(function (result) {
//do something with the result
})
});
});
</script>
}
现在您需要一个 HttpPost 操作方法来处理您的表单发布。
[HttpPost]
public ActionResult Create(IEnumerable<CreateUser> model)
{
foreach(var item in model)
{
// to do :Save
}
return Json( new { status ="success"});
}
你的 CreateUser 视图模型看起来像
public class CreateUser
{
public string Name { set;get;}
public int Age { set; get; }
public DateTime CreateDate { set; get; }
}
【讨论】:
更简单的方法。
型号:
public class MyModel
{
public IList<OneSetOfElements> FormSet { get; set; }
}
public class OneSetOfElements
{
public string Name { get; set; }
public int Age { get; set; }
[DataType(DataType.Date)]
public DateTime Dob { get; set; }
}
行动:
public ActionResult MyAction(MyModel model)
{
foreach (var set in model.FormSet)
{
//read your data.
}
}
查看:点击时显示 id“showMeOnUrlClick”
@using (Html.BeginForm())
{
//This would bind as first list element
<div id="firstSet">
@Html.EditorFor(m => m.FormSet[1].Name)
@Html.EditorFor(m => m.FormSet[1].Age)
@Html.EditorFor(m => m.FormSet[1].Dob, new { type = "date" })
</div>
//Remaining list element
<div id="showMeOnUrlClick" style="display: none">
@for (int i = 1; i <= 6; i++)
{
@Html.EditorFor(m => m.FormSet[i].Name)
@Html.EditorFor(m => m.FormSet[i].Age)
@Html.EditorFor(m => m.FormSet[i].Dob, new {type = "date"})
}
</div>
<button onclick="showTheRepeatedFields() ">Show</button>
}
【讨论】: