gpt4 book ai didi

asp.net-mvc - ASP.Net MVC4 将 "create view"绑定(bind)到包含 List 的模型

转载 作者:行者123 更新时间:2023-12-03 04:29:51 26 4
gpt4 key购买 nike

你好,在互联网领域,我有一个有趣的难题要问你:

如果该对象包含纯粹使用 MVC View /部分 View 的其他对象的列表,是否可以绑定(bind) View 来创建对象?

伙计,这一切都很复杂……让我给你一个快速的代码示例来说明我的意思:

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”属性来说,创建其中之一的强类型 View 非常简单:

something like:
@Html.TextBoxFor(x => x.title)

但我想不出使用 MVC 绑定(bind)“ContainedObjects”列表的好方法。我得到的最接近的是使用“List”脚手架模板创建一个强类型的 IEnumerable 部分 View 并将其包含在页面上。

在不添加样式等的情况下,该部分 View 的默认外观是:

@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 中。换句话说,我可以通过如下绑定(bind)来显示已存在的 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 代码。我希望在整体上保持相当一致。

还有其他人遇到过这个问题并找到解决方案吗?

最佳答案

我最近发现自己需要完成同样的任务,并且像您一样,不想添加一堆 JavaScript。我正在使用 MVC4,据我所知,似乎没有一种现成的方法可以将模型的可枚举属性绑定(bind)到 View 。 :(

但是,正如您在问题中所演示的那样,可以从 View 中的模型中检索可枚举属性。诀窍就是将更新返回到 Controller 。离开示例模型,您的 View 可能如下所示(您不需要制作部分 View ):

@model MVCComplexObjects.Models.ComplexObject

<p>
@Html.ActionLink("Create New", "Create")
</p>

@using (Html.BeginForm("SaveNew", "Home", FormMethod.Post))
{
<table>

<tr>
<th>
@Html.DisplayNameFor(model => model.contents[0].name)
</th>
<th>
@Html.DisplayNameFor(model => model.contents[0].data)
</th>
<th></th>
</tr>

@for (int i = 0; i < Model.contents.Count; i++)
{
<tr>
<td>
@Html.TextBox("updatedContents["+i+"].name", Model.contents[i].name)
</td>
<td>
@Html.TextBox("updatedContents["+i+"].data", Model.contents[i].data)
</td>
<td>
@* Got rid of the edit and detail links here because this form can now act as both *@
@Html.ActionLink("Delete", "Delete", new { /* id=item.PrimaryKey */ })
</td>
</tr>
}

</table>

<input type="submit" value="Save" />
}

您的 Controller 操作将如下所示:

[HttpPost]
public ActionResult SaveNew(ICollection<ContainedObject> updatedContents)
{
foreach (var co in updatedContents)
{
//Update the contained object...
}

return RedirectToAction("Index");
}

基本上,我们在 View 中定义一个新的集合对象,以便 MVC 在表单提交时传递给您的操作方法。新对象(本例中为“updatedContents”)与 ComplexObject 模型中定义和填充的列表属性(本例中为“contents”)基本相同。

这需要更多的工作,但确实实现了不需要任何 javascript 进行回发的目标。一切都可以用标准 MVC 来完成。

关于asp.net-mvc - ASP.Net MVC4 将 "create view"绑定(bind)到包含 List 的模型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12974957/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com