1

データベースにFieldというテーブルとFieldValueというテーブルがあります。私のモデルは次のようになります。

[Table("Field")]
public class Field
{
    [Key]
    [DatabaseGeneratedAttribute(DatabaseGeneratedOption.Identity)]
    public int FieldId { get; set; }
    public string Value { get; set; }
}

[Table("FieldValue")]
public class FieldValue
{
    [Key]
    [DatabaseGeneratedAttribute(DatabaseGeneratedOption.Identity)]
    public int FieldValueId { get; set; }
    public int FieldId { get; set; }
    public string Value { get; set; }
}

各フィールドをラベルとして表示し、次にそのフィールドに関連付けられている各FieldValueのテキストボックスを表示したいのですが、これにどのようにアプローチするかがよくわかりません。それが重要な場合は、MVC4を使用しています。

4

3 に答える 3

1

結合された配列をビュー モデル クラスに返すことができます (構文/タイプミスについてはテストされていません)。

public class ViewModel
{
    public KeyValuePair<string,string> Fields { get; set; }
}

var kvps = Fields.Join(FieldValues,
    f => f.FieldId,
    fv => fv.FieldId,
    (f, fv) => 
        new KeyValuePair<string,object>(f.Value, fv.Value)
    }).ToArray();
var viewModel = new ViewModel { Fields = kvps };

return View(viewModel);

次に、ビューで値を反復処理します。

@model MyNamespace.ViewModel

@foreach (var kvp in Model.Fields)
{
    <span class="field-label">@kvp.Key</span>
    <span class="field-value">@Html.TextBoxFor(_ => kvp.Value)</span>
}

これをフォームに入れると、ポストバックも正しく機能するはずです (を使用しているためTextBoxFor)。

于 2012-12-07T16:52:11.847 に答える
0

ここでの答えは、事前にいくつのフィールドがあるかを知っているかどうかによって異なります。

その場合は、強く型付けされたモデルを作成して mvc ビューをバインドし、次のようにデータ注釈を使用する必要があります。

public class MyModel
{
    [Display(Name="Field name 1")
    public string Field1 { get; set; }

    [Display(Name="Field name 2")
    public string Field2 { get; set; }
}

次に、ビューで次のコードを使用できます。

@Html.LabelFor(model => model.Field1)
@Html.TextBoxFor(model => model.Field1)

@Html.LabelFor(model => model.Field1)
@Html.TextBoxFor(model => model.Field1)

ただし、前もってフィールドの数がわからないため、このように厳密に型指定されたモデルを設定できない場合は、次のことをお勧めします。

  • 値に簡単にアクセスできるように、フィールドにナビゲーション プロパティを追加します。
  • データベースとおそらく
  • ビューにループを記述し、次のような古い学校の html ヘルパーを使用します。

...

@for (var key in model.FieldDictionary.Keys)
{
    @Html.Label("key", model.FieldDictionary(key))
    @Html.TextBox(model.FieldDictionary(key))
}

このコードはテストされていないことに注意してください。2 番目の例では、フォームを投稿するときにデータを元に戻す方法を理解する必要がありますが、出発点になることを願っています。

お役に立てれば!

于 2012-12-07T16:52:30.270 に答える
0

あなたが何をしようとしているのかわからないので、仮定をしたくありませんが、間違った方向に進んでいる可能性があると感じています. おそらくご存知のように、MVC には強く型付けされたビューがあるため、ビューを Person などの便利なビジネス オブジェクトに「バインド」し、次のようなものを使用して HTML を生成できます。

Html.TextBoxFor(p => p.Name)

ここで、p は人です

あなたが構築しようとしているものは、これを達成するためのハックのようです。情報を保持する意味のあるオブジェクトを作成し、それらを厳密に型指定されたビューに渡すことはできませんか? 別のページに同じフィールドがある場合は、同じオブジェクトを渡します。

于 2012-12-07T16:40:50.200 に答える