2017-03-16 5 views
-1

ビューに2つのモデルがあります。 forループを実行している間、モデルの属性の1つの値を他のモデル属性に設定できるようにしたい。明確化のためのコード例: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に渡されることはありません。 (modelbundleインサイド)例えば

 [HttpPost] 
    public ActionResult Post(modelbundle model) 
    { 
     List<Two> list = model.Two; // Model bundle contains a list. Eg. model.Two[0].ObjectId = null 
     ... 
} 

モデル-2:Davidさんの助けを借りて

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で行うように)、の新しいインスタンスには、以前のインスタンスに行った変更はありません。

ウェブアプリケーションへの回覧...その値をサーバーにポストバックする際にその値を含めるには、転記されるフォームに値を含める必要があります。このような何か:

@Html.HiddenFor(modelItem => Model.Two[item].ObjectId) 

これは、フォームで掲示される値が含まれている<input type="hidden" />をレンダリングします。もちろん、この値はクライアントから来るので、ユーザの値を編集できます。

関連する問題