MVC Razor - 将模型值设置为其他模型值?
问题描述:
我在视图中有2个模型。我希望能够在通过for循环时将模型的其中一个属性值设置为其他模型属性。澄清实施例的代码:MVC Razor - 将模型值设置为其他模型值?
@model xxx.Models.modelbundle
@using (Html.BeginForm("Post", "Admin", FormMethod.Post))
{
for (int item = 0; Model.One.Count > item; item++)
{
<tr>
<td>
@Html.DisplayFor(modelItem => Model.One[item].ObjectId)
</td>
<td>
@Html.CheckBoxFor(modelItem => Model.Two[item].set)
</td>
@Model.Two[item].ObjectId = Model.One[item].ObjectId; // Here. How to set them?
</tr>
}
<div>
<input type="submit" id="button" value="Change Me" href="/Admin">
<div></div>
</div>
}
编辑:
的ObjectId不会通过到Model.Two传递。例如
[HttpPost]
public ActionResult Post(modelbundle model)
{
List<Two> list = model.Two; // Model bundle contains a list. Eg. model.Two[0].ObjectId = null
...
}
模型的两个(内部modelbundle):
public class
{
public bool get { get; set; }
public bool list { get; set; }
public bool set { get; set; }
public bool delete { get; set; }
public bool all { get; set; }
public string ObjectId { get; set; }
public string displayName { get; set; }
}
随着大卫的帮助 - 这是为我工作。我知道它可能没有蓝色/黄色变量来实现,但它可以更容易(对我来说)阅读:
@{
var yellow = Model.One[item].DisplayName;
Model.Two[item].displayName = yellow;
var blue = Model.One[item].ObjectId;
Model.Two[item].ObjectId = blue;
}
@Html.HiddenFor(modelItem => Model.Two[item].displayName);
@Html.HiddenFor(modelItem => Model.Two[item].ObjectId);
答
在此控制器操作:
[HttpPost]
public ActionResult Post(modelbundle model)
{
//...
}
的model
变量只有有什么客户端页面发送它。而已。因此,例如,该客户端输入该物业发送的值:
@Html.CheckBoxFor(modelItem => Model.Two[item].set)
但是,这不会产生任何类型的客户端的标记在所有:
@Model.Two[item].ObjectId = Model.One[item].ObjectId;
所有该行将在传递给视图的模型实例上设置一个属性。如果在渲染该视图时从未使用过该属性,那么只要视图完成构建并且该模型的实例超出范围,该属性就会丢失。
在结构上,概念将类似于此:
void Method1()
{
var something = new SomeObject();
Method2(something);
}
void Method2(SomeObject obj)
{
obj.SomeProperty = "some value";
}
属性设置成功,但只要Method1()
执行完它的丢失,因为从来都没有使用过。这个例子超出了范围,现在消失了。当您在稍后创建SomeObject
的新实例时(如ASP.NET中的模型联编程序在接收到来自客户端的请求时在ASP.NET中执行的操作),那么新的实例将不会对先前实例进行更改。
回到您的web应用程序...为了将该值包含在发布回服务器的内容中,该值需要包含在发布的表单中。事情是这样的:
@Html.HiddenFor(modelItem => Model.Two[item].ObjectId)
这将呈现<input type="hidden" />
包含着价值与形式予以公布。当然需要注意的是,由于该值将来自客户端,用户可以通过编辑该值。
你为什么在视图*中设置模型属性*?这应该在模型发送到视图之前完成。当然,这不应该起作用。 (你如何确认它没有?在显示的代码中,你永远不会引用你更新的属性。)但是也没有理由首先这样做。 – David
我知道这不起作用,因为我模型中的ObjectId总是返回null。此外,因为我正在使用复选框更改/编辑模型中的属性 - 我想将它放在正确的位置(这是否合理?)并将其弹出到相同的循环中。 :) – Pikapops
“回来null”*其中*?显示的代码从未在设置后引用该属性。你需要证明这个问题。 – David