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); 
+0

你为什么在视图*中设置模型属性*?这应该在模型发送到视图之前完成。当然,这不应该起作用。 (你如何确认它没有?在显示的代码中,你永远不会引用你更新的属性。)但是也没有理由首先这样做。 – David

+0

我知道这不起作用,因为我模型中的ObjectId总是返回null。此外,因为我正在使用复选框更改/编辑模型中的属性 - 我想将它放在正确的位置(这是否合理?)并将其弹出到相同的循环中。 :) – Pikapops

+0

“回来null”*其中*?显示的代码从未在设置后引用该属性。你需要证明这个问题。 – David

在此控制器操作:

[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" />包含着价值与形式予以公布。当然需要注意的是,由于该值将来自客户端,用户可以通过编辑该值。