0

私は MVC が初めてで、MVC4 を使用しており、C# も初めてです。1 つのビューで tblProduct と tblCategory の 2 つのテーブルからデータを取得したいと考えています。そのビューでは、tblCategory から列 "Name" を取得し、tblProduct からすべての列を取得したいと考えています。

テーブルは、最初にクラス tables.cs のコードで定義しました。

public class tblCategory 
{
        //Primary Key
        [Key]
        [ScaffoldColumn(false)]
        public int CategoryId { get; set; }

        [MaxLength(160)]
        public string Name { get; set; }
        etc...
}

public class tblProduct {
        //Primary Key
        [Key]
        [ScaffoldColumn(false)]
        public int ProductId { get; set; }

        //Foreign Key
        public int CategoryId { get; set; }
        [ForeignKey("CategoryId")]
        public virtual tblCategory tblCategorys { get; set; }

        [MaxLength(500)]
        public string MainImageFileName { get; set; }
        [MaxLength(160)]
        public string Name { get; set; }

        ect...
}

私のモデルクラス、bar.cs:

Namespace xx.Models
    public class bar {
        public tblProduct product { get; set; }
        public tblCategory category { get; set; }
    }

コントローラーで Index クラスを定義するにはどうすればよいですか? モデル バーからビューにデータを送信できるようにします。

public ActionResult Index(){
  //How to define this?
}

そして、どのようにビューを構築する必要がありますか? @モデル xx.Models.bar

しかし、tblProduct のすべての列に対してビューで Foreach ループを使用したいと考えています。そして、tblCategory からの 1 つの列。

誰かがこれで私を助けることができますか? ありがとう!

4

2 に答える 2

1

Index アクションは、bar クラスのインスタンスを構築する必要があります

public ActionResult Index(){
    var b = new bar();
    b.product = some loading code;
    b.category= some loading code;
    return View(b);
}

Index.cshtml は、同じモデルのインスタンスを期待する必要があります

@model ProjectName.xx.Models.bar

<div class="editor-label">
    @Html.LabelFor(model => model.category.Name)
</div>
<div class="editor-field">
    @Html.EditorFor(model => model.category.Name)
    @Html.ValidationMessageFor(model => model.category.Name)
</div>

@* just duplicate this once for each property you want from product *@
<div class="editor-label">
    @Html.LabelFor(model => model.product.Name)
</div>
<div class="editor-field">
    @Html.EditorFor(model => model.product.Name)
    @Html.ValidationMessageFor(model => model.product.Name)
</div>

リフレクションが必要であり、ページが非常に高速に機能するとは思えないため、製品のプロパティで for ループを使用しません。

于 2012-12-19T19:51:41.620 に答える
0

このクラスは両方ともモデルであるべきだと思います。明らかに、データベース内のテーブルの表現です。しかし、バーのクラスはそうではないと思います。構造は次のように編成する必要があると思います:製品(モデルクラス)、カテゴリ(モデルクラス)=バー(モデルコレクションクラス)。そのため、両方のクラスをクラス Bar のプロパティとして追加する代わりに、これらのクラスを含む辞書を定義する必要がありますが、それらのクラスを共通のインターフェイス、つまり IViewModel と関連付けます。

public interface IViewModel{
  string name {get;set;}
}
public class TblProduct: IVievModel{
 /// your code
}
public class TblCategory: IVievModel{
 /// your code
}
public class Bar{
 private Dictionary<string, IViewModel> viewModels = new Dictionary<string,IViewModel>();
}

ActionResult メソッドで、これら 2 つのクラスをディクショナリに追加し、このクラス Bar をビューに返します。

于 2012-11-30T12:17:34.580 に答える