如果你想允許用戶在你需要使用JavaScript來更新客戶端添加一個新的表單元素DOM與你想添加的新元素。要列出現有的項目,您可以使用編輯器模板。混合這兩個將給你一個動態的形式。以下是一個基本的實現。
要使用編輯器模板,我們需要爲屬性類型創建一個編輯器模板。我不會那樣做string
類型,它更像是一個通用的類型。我會創建一個自定義類來表示列表項。
public class Item
{
public string Name { set; get; }
}
public class ShoppingList
{
public int ShoppingListId { get; set; }
public string Name { get; set; }
public List<Item> ListItems { get; set; }
public ShoppingList()
{
this.ListItems=new List<Item>();
}
}
現在,~/Views/YourControllerName
或~/Views/Shared/
下創建一個名爲EditorTemplates
目錄,並創建一個名爲Item.cshtml
視圖裏面會有下面的代碼
@model YourNameSpaceHere.Item
<input type="text" asp-for="Name" class="items" />
現在,在您的GET控制器,創建ShoppingList的對象,發送到視圖。
public IActionResult ShoppingList()
{
var vm = new ShoppingList() { };
return View(vm);
}
現在在主視圖,所有你需要做的就是調用EditorFor方法
@model YourNamespace.ShoppingList
<form asp-action="ShoppingList" method="post">
<input asp-for="Name" class="form-control" />
<div class="form-group" id="item-list">
<a href="#" id="add">Add</a>
@Html.EditorFor(f => f.ListItems)
</div>
<input type="submit" value="Create" class="btn btn-default" />
</form>
的標記有新增項目的一個錨標記。因此,當用戶點擊它,我們需要與name屬性值的格式添加一個新的輸入元素ListItems[indexValue].Name
$(function() {
$("#add").click(function (e) {
e.preventDefault();
var i = $(".items").length;
var n = '<input type="text" class="items" name="ListItems[' + i + '].Name" />';
$("#item-list").append(n);
});
});
因此,當用戶點擊它增加了使用正確的名稱到DOM,當一個新的輸入元素您單擊提交按鈕模型綁定將正常工作,因爲我們具有輸入的正確名稱屬性值。
[HttpPost]
public IActionResult ShoppingList(ShoppingList model)
{
//check model.ListItems
// to do : return something
}
如果你想預加載一些現有的項目(編輯畫面等),所有你需要做的就是加載listItems屬性和編輯模板將渲染輸入元素與正確名稱每個項目的護理屬性值。
public IActionResult ShoppingList()
{
var vm = new ShoppingList();
vm.ListItems = new List<Item>() { new Item { Name = "apple" } }
return View(vm);
}
使用jQuery將輸入元素添加到DOM。 – Shyju
我得到的問題是,當我提交表單時,新添加的元素不會與提交一起發送。 @Shyju – conterio
它只要我們的名字與模型綁定器正在尋找的內容相匹配就可以實現。分享你試過的代碼 – Shyju