幾件事情的開始是你需要記住默認的ModelBinder是遞歸的,它會試着弄清楚它需要做什麼......所以很聰明。另一件事要記住的是你不需要使用HTML助手,實際的HTML工作正常以及:-)
所以,先用型號,沒啥區別在這裏..
public class ParentViewModel
{
public int Id { get; set; }
public string Name { get; set; }
public List<ChildViewModel> Child { get; set; }
}
public class ChildViewModel
{
public int Id { get; set; }
public string FirstName { get; set; }
}
父局部視圖 - 這取ParentViewModel的實例
<%@ Control Language="C#" Inherits="System.Web.Mvc.ViewUserControl<ParentViewModel>" %>
<h2>Parent</h2>
<%: Html.TextBox("parent.Name", Model.Name) %>
<%: Html.Hidden("parent.Id", Model.Id) %>
<% foreach (ChildViewModel childViewModel in Model.Child)
{
Html.RenderPartial("Child", childViewModel);
}
%>
兒童局部視圖 - 這需要的ChildViewModel
<%@ Control Language="C#" Inherits="System.Web.Mvc.ViewUserControl<ChildViewModel>" %>
<h3>Child</h3>
<%: Html.Hidden("parent.Child.index", Model.Id) %>
<%: Html.Hidden(string.Format("parent.Child[{0}].Id", Model.Id), Model.Id)%>
<%: Html.TextBox(string.Format("parent.Child[{0}].FirstName", Model.Id), Model.FirstName) %>
東西在這一點上要注意的單實例是,指數值是什麼用於在列表中的工作出了獨特的記錄。這不需要是增量值。
那麼,你怎麼稱呼它呢?那麼在索引操作中,它將顯示需要傳入的數據。我已經設置了一些演示數據,並將它在ViewData字典中返回到索引視圖。
所以控制器動作......
public ActionResult Index()
{
ViewData["Message"] = "Welcome to ASP.NET MVC!";
ViewData["Parent"] = GetData();
return View();
}
private ParentViewModel GetData()
{
var result = new ParentViewModel
{
Id = 1,
Name = "Parent name",
Child = new List<ChildViewModel>
{
new ChildViewModel {Id = 2, FirstName = "first child"},
new ChildViewModel {Id = 3, FirstName = "second child"}
}
};
return result;
}
在現實世界中,你會調用數據服務等
最後索引視圖的內容:
<form action="<%: Url.Action("Edit") %>" method="post">
<% if (ViewData["Parent"] != null) { %>
<%
Html.RenderPartial("Parent", ViewData["Parent"]); %>
<% } %>
<input type="submit" />
</form>
儲蓄
所以現在我們有數據顯示我們如何回到行動?那麼這是默認模型聯編程序將爲您在簡單的數據類型中爲相對複雜的隊列所做的事情。所以,你可以設置要發佈到作爲行動的基本格式:如需要
[HttpPost]
public ActionResult Edit(ParentViewModel parent)
{
}
這會給你與原來的ID的更新的詳細信息(從隱藏字段),因此您可以更新/編輯。
通過Ajax
你在你的問題中加載自定義模板通過AJAX提到
新的孩子,你的意思是如何給用戶增加的另一個孩子沒有回發的選項?
如果是這樣,你做這樣的事情......
添加操作 - 需要一個行動,這將返回一個新ChildViewModel
[HttpPost]
public ActionResult Add()
{
var result = new ChildViewModel();
result.Id = 4;
result.FirstName = "** to update **";
return View("Child", result);
}
我已經給它一個id,方便的演示目的。
然後您需要一種調用代碼的方式,因此您需要更新的唯一視圖是主索引視圖。這將包括獲取操作結果的JavaScript,調用代碼的鏈接以及要附加到HTML的目標HTML標記。另外不要忘記在master頁面或視圖的頂部添加對jQuery的引用。
索引視圖 - 已更新!
<script type="text/javascript">
function add() {
$.ajax(
{
type: "POST",
url: "<%: Url.Action("Add", "Home") %>",
success: function(result) {
$('#newchild').after(result);
},
error: function(req, status, error) {
}
});
}
</script>
<form action="<%: Url.Action("Edit") %>" method="post">
<% if (ViewData["Parent"] != null) { %>
<%
Html.RenderPartial("Parent", ViewData["Parent"]); %>
<% } %>
<div id="newchild"></div>
<br /><br />
<input type="submit" /> <a href="#" onclick="JavaScript:return add();">add child</a>
</form>
這將調用添加動作,並追加回應時,它返回到newChild對象DIV提交按鈕的上方。
我希望長篇文章很有用。
Enjoy :-)
你的長文章非常有用,非常感謝。看起來這正是我所需要的。 – Chris 2010-07-25 09:17:05
@Chris - 真棒,很高興它的有用:-) – WestDiscGolf 2010-07-25 20:10:21