你好,在互联网领域,我有一个有趣的难题要问你:
如果该对象包含纯粹使用 MVC 视图/部分视图的其他对象列表,是否可以绑定视图以创建对象?
伙计,这一切都很复杂……让我给你一个快速的代码示例来说明我的意思:
Models:
public class ComplexObject
{
public string title { get; set; }
public List<ContainedObject> contents { get; set; }
}
public class ContainedObject
{
public string name { get; set; }
public string data { get; set; }
}
又好又简单对吧?好的,因此对于“title”属性来说,创建其中之一的强类型视图非常简单:
something like:
@Html.TextBoxFor(x => x.title)
但我想不出使用 MVC 绑定“ContainedObjects”列表的好方法。我得到的最接近的是使用“列表”脚手架模板创建一个强类型的 IEnumerable 部分视图,并将其包含在页面上。
在不添加样式等的情况下,该部分视图的默认外观是:
@model IEnumerable<MVCComplexObjects.Models.ContainedObject>
<p>
@Html.ActionLink("Create New", "Create")
</p>
<table>
<tr>
<th>
@Html.DisplayNameFor(model => model.name)
</th>
<th>
@Html.DisplayNameFor(model => model.data)
</th>
<th></th>
</tr>
@foreach (var item in Model) {
<tr>
<td>
@Html.DisplayFor(modelItem => item.name)
</td>
<td>
@Html.DisplayFor(modelItem => item.data)
</td>
<td>
@Html.ActionLink("Edit", "Edit", new { /* id=item.PrimaryKey */ }) |
@Html.ActionLink("Details", "Details", new { /* id=item.PrimaryKey */ }) |
@Html.ActionLink("Delete", "Delete", new { /* id=item.PrimaryKey */ })
</td>
</tr>
}
</table>
但坦率地说,我不知道如何将其包含在与创建新的 ComplexObject 的绑定中。换句话说,我可以通过绑定显示已经存在的 ContainedObjects 列表:@Html.Partial("PartialCreate", Model.contents)
但我想我真正想要的是:
@Html.PartialFor("PartialCreate", x => x.contents)
我应该注意,使用 Javascript 进行编码并没有太多麻烦(我将包括下面的代码),但我真的很想知道是否有一种方法可以纯粹使用 MVC 来做到这一点。我最近从 WebForms 转换过来(无论如何,我几乎只是用 AJAX 调用替换了我所有的回发),这种事情在我从事的项目中经常出现。
无论如何,这是我目前的做法:
html -
Name: <input type="text" id="enterName" />
Data: <input type="text" id="enterData" />
<a id="addItem">Add Item</a>
<ul id="addedItems">
</ul>
<a id="saveAll">Save Complex Object</a>
Javascript -
<script>
var contents = [];
$(document).ready(function () {
$('#addItem').click(function () {
var newItem = { name: $('#enterName').val(), data: $('#enterData').val() };
contents.push(newItem);
$('#addedItems').html('');
for (var i = 0; i < contents.length; i++) {
$('#addedItems').append(
"<li>" + contents[i].name + ", " + contents[i].data + "</li>"
);
}
});
$('#saveAll').click(function () {
var toPost = { title: "someTitle", contents: contents };
$.ajax({
url: '/Home/SaveNew',
type: 'POST',
data: JSON.stringify(toPost),
dataType: 'json',
contentType: 'application/json; charset=utf-8',
success: function (data, textStatus, jqXHR) {
alert("win");
},
error: function (objAJAXRequest, strError) {
alert("fail");
}
});
});
});
</script>
这不是一个糟糕的解决方案或任何东西,我只是不想每次我想保存一个新对象时都必须实现 Javascript 调用,而是在其他任何地方使用标准的 Razr 代码。我希望全面保持一致。
有没有其他人遇到过这个问题并找到了解决方案?