4

Webフォームを使用してWebサイトを開発していますが、現在、RzorでMVC3フレームワークを使用しているプロジェクトがあります。私の質問は、MVCのいくつかの基本的なデザインパターンについてです。私はWebページを持っており、左側にSQLテーブルからカテゴリをプルし、中央に別のSQLテーブルをクエリし、ページ全体にさらにいくつかを追加します。

だから私の質問は...データを1つのWebページに取り込むための最良の方法は何ですか?これらのクエリはすべて完全に独立しています、クエリごとに新しいモデルを作成する必要がありますか?またはそれを行うためのより良い方法がありますか?

WebFormsでは、ユーザーコントロールを使用しました。ここでは、すべてのユーザーコントロールに独自のデザインとSQLクエリがあります。MVCでパーシャルビューを使用することについて聞いたことがありますが、よくわかりません。さまざまなクエリを使用してデータを1つのWebページに取り込み、Webページに出力を表示する方法を理解するのに苦労していると思います。

ありがとう

4

1 に答える 1

7

を作成する必要がありますViewModel以下の更新を見てください

これはあなたのページを表すモデルです。ビューに表示する要素は、ViewModelに存在する必要があります。コントローラにViewModelを入力し、ページに表示します。

ショッピングサイトのページの例を作成しました。左側にカテゴリがあり、中央に商品があります。両方のエンティティは異なるテーブルに存在します。

例:

class MainPageViewModel
{
  //this data is from a different table.
  //and goes on the left of the page
 public string Categories {get; set;}
  //this data is also from a different table.
  //and goes on the center of the page
 public List<Products> Products {get; set;}
}

コントローラ内:

public class HomeController : Controller
{
    // GET: /Home/
    public ActionResult Index()
    {
        MainPageViewModel vm = new MainPageViewModel();
        vm.Categories = GetCategories();
        //use the GetProducts() to get your products and add them.
        vm.Products.Add(...); 
        return View(vm); //pass it into the page
    }
    string[] GetCategories()
    {
     DataTable data = GetDataFromQuery("SELECT * FROM Categories WHERE..");
     //convert the data into a string[] and return it..
    }
    //maybe it has to return something else instead of string[]? 
    string[] GetProducts()
    {
     DataTable data = GetDataFromQuery("SELECT * FROM Products WHERE..");
     //convert the data into a string[] and return it..
    }
    DataTable GetDataFromQuery(string query)
    {
        SqlDataAdapter adap = 
             new SqlDataAdapter(query, "<your connection string>");
        DataTable data = new DataTable();
        adap.Fill(data);
        return data;
    }  
}

次に、ビューに適切に表示します。

@model MainPageViewModel 

@{ ViewBag.Title = "MainPage"; }

<div id="left-bar">
  <ul>
    @foreach (var category in Model.Categories)
    {
        <li>@category</li>
    }
  </ul>
</div>
<div id="center-content">
    <ul>
    @foreach (var product in Model.Products)
    {
        <li>@product.Name</li>
        <li>@product.Price..</li>
        .....
    }
  </ul>  
</div>

アップデート

これは、データベースのテーブルと列が定期的に変更されると述べたコメントに関するものです。

はっきりとは言えませんが、毎日そのようなテーブルを作成するべきではないかもしれません。より良いデータベース設計があるかもしれません。あるいは、RDBMSが適切ではないので、NoSqlを調べる必要があります。データベース(MongoDBなど)

それでも、上記のコードを続行する場合は、これを独自のデータレイヤークラスに入れることをお勧めします。

また、Dapperも見てください。これは、SQLクエリまたはストアドプロシージャを使用してデータベースからオブジェクトを取得するだけの非常に薄いデータアクセス層です。(まさにあなたが必要とするもの)それはstackoverflowによって作られそして使われます。

于 2012-09-02T06:07:47.550 に答える