2017-03-16 82 views
-1

我在視圖中有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

回答

1

在此控制器操作:

[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" />包含着價值與形式予以公佈。當然需要注意的是,由於該值將來自客戶端,用戶可以通過編輯該值。