如果你想为你做脚手架,很遗憾,这是不可能的,你不能做到这一点简单地。此外,您必须使用 jquery 和 ajax 来实现您想要的。
我认为对你来说最好和最简单的方法是你有一个创建表单的视图,并在它的底部放置一个字段集来为它分配 FormFields。
对于字段集,您应该有两个局部视图:一个用于创建,另一个用于编辑。创建的局部视图应该是这样的:
@model myPrj.Models.Form_FormFieldInfo
@{
var index = Guid.NewGuid().ToString();
string ln = (string)ViewBag.ListName;
string hn = ln + ".Index";
}
<tr>
<td>
<input type="hidden" name="@hn" value="@index" />
@Html.LabelFor(model => model.FormFieldID)
</td>
<td>
@Html.DropDownList(ln + "[" + index + "].FormFieldID",
new SelectList(new myPrj.Models.DbContext().FormFields, "ID", "FieldName"))
</td>
<td>
<input type="button" onclick="$(this).parent().parent().remove();"
value="Remove" />
</td>
</tr>
通过ajaxly在create place view中调用这个局部视图,你可以为每个标签渲染一些元素。每行元素包含一个标签、一个包含标签的 DropDownList 和一个删除按钮,用于简单地删除创建的元素。
在创建位置视图中,您有一个裸表,其中将包含您通过部分视图创建的那些元素:
<fieldset>
<legend>Form and FormFields</legend>
@Html.ValidationMessageFor(model => model.FormFields)</label>
<table id="tblFields"></table>
<input type="button" id="btnAddTag" value="Add new Field"/>
<img id="imgSpinnerl" src="~/Images/indicator-blue.gif" style="display:none;" />
</fieldset>
你有以下脚本来为每个标签创建一行元素:
$(document).ready(function () {
$("#btnAddField").click(function () {
$.ajax({
url: "/Controller/GetFormFieldRow/FormFields",
type: 'GET', dataType: 'json',
success: function (data, textStatus, jqXHR) {
$("#tblFields").append(jqXHR.responseText);
},
error: function (jqXHR, textStatus, errorThrown) {
$("#tblFields").append(jqXHR.responseText);
},
beforeSend: function () { $("#imgSpinnerl").show(); },
complete: function () { $("#imgSpinnerl").hide(); }
});
});
});
动作方法GetFormFieldRow如下:
public PartialViewResult GetFormFieldRow(string id = "")
{
ViewBag.ListName = id;
return PartialView("_FormFieldPartial");
}
您已经完成了创建...您问题的整个解决方案有许多用于视图、部分视图、控制器、ajax 调用和模型绑定的代码。我试图向您展示方式,因为我真的无法在此答案中发布所有这些。
Here 是完整的信息和操作方法。
希望这个答案对您有用并为您指明方向。