4

私のモデルは

public class SiteConfig
{
    public SiteConfig()
    {

    }

    public int IdSiteConfig { get; set; }
    public string Name { get; set; }
    public byte[] SiteLogo { get; set; }
    public string Brands { get; set; }
    public string LinkColour { get; set; }

    public IEnumerable<SiteBrand> SiteBrands { get; set; }
}

public class SiteBrand
{
    public int Id { get; set; }
    public int SiteId { get; set; }
    public int BrandId { get; set; }

    public Brand Brand { get; set; }
    public SiteConfig SiteConfig { get; set; }
}

public class Brand
{
    public int BrandId { get; set; }
    public string Name { get; set; }

    public IEnumerable<SiteBrand> SiteBrands { get; set; }
}

私はデータベースの最初のアプローチに従っています。各 SiteConfig レコードには、1 つ以上のブランドを含めることができます。したがって、Brand は SiteBrand という別のテーブルに保存しています。

SiteBrand には、SiteConfig (IdSiteConfig 上) と Brand (BrandId) の両方への外部キー参照が含まれています。

SiteConfig を作成しているときに、ユーザーが 1 つまたは複数のレコードを選択できるリスト ボックスとして、利用可能なすべてのブランドを表示したいと考えています (ブランドを選択しない場合があります)。

しかし、ビューをモデルにバインドするときに、リスト ボックスをブランドのリストにバインドする方法と、ビューが投稿されたときに選択したブランドを取得する方法を教えてください。

そして、選択した項目とともに SiteConfig オブジェクトをデータベースに保存する必要があります。これが私のDB図です。

これは、db に保存する私の DAL です。

public SiteConfig Add(SiteConfig item)
    {
        var siteConfig = new Entities.SiteConfig
            {
                Name = item.Name,
                LinkColour = item.LinkColour,
                SiteBrands = (from config in item.SiteBrands
                              select new SiteBrand {BrandId = config.BrandId, SiteId = config.SiteId}).
                    ToList()
            };
        _dbContext.SiteConfigs.Add(siteConfig);
        _dbContext.SaveChanges();
        return item;
    }

DB スキーマ

リストボックスをバインドして選択したアイテムを取得する方法を教えてください。

ありがとう。

4

2 に答える 2

12

文字列配列型の新しいプロパティを SiteConfig ViewModel に追加します。Listboxこれを使用して、ユーザーがこのフォームを投稿 したときに Selected アイテムを取得します。

public class SiteConfig
{
  //Other properties here
  public string[] SelectedBrands { get; set; }  // new proeprty
  public IEnumerable<SiteBrand> SiteBrands { get; set; }
}

GET アクション メソッドで、SiteConfig ViewModel オブジェクトのリストを取得SiteBrandsしてプロパティに割り当てます。SiteBrands

public ActionResult CreateSiteConfig()
{
    var vm = new SiteConfig();
    vm.SiteBrands = GetSiteBrands();
    return View(vm);
}

デモ用に、メソッドをハードコーディングしました。これを実装すると、データ アクセス レイヤーからデータを取得できます。

public IList<SiteBrand> GetSiteBrands()
{
    List<SiteBrand> brands = new List<SiteBrand>();
    brands.Add(new SiteBrand { Brand = new Brand { BrandId = 3, Name = "Nike" } });
    brands.Add(new SiteBrand { Brand = new Brand { BrandId = 4, Name = "Reebok" } });
    brands.Add(new SiteBrand { Brand = new Brand { BrandId = 5, Name = "Addidas" } });
    brands.Add(new SiteBrand { Brand = new Brand { BrandId = 6, Name = "LG" } });
    return brands;
}

SiteConfigViewModel に強く型付けされたビューで、

@model SiteConfig
<h2>Create Site Config</h2>
@using (Html.BeginForm())
{
  @Html.ListBoxFor(s => s.SelectedBrands, 
                new SelectList(Model.SiteBrands, "Brand.BrandId", "Brand.Name"))
  <input type="submit" value="Create" />
}

SelectedBrandsユーザーがこのフォームを投稿すると、ViewModelのプロパティで選択されたアイテムの値が取得されます。

[HttpPost]
public ActionResult CreateSiteConfig(SiteConfig model)
{
    if (ModelState.IsValid)
    {
        string[] items = model.SelectedBrands;
        //check items now
        //do your further things and follow PRG pattern as needed
    }
    model.SiteBrands = GetBrands();
    return View(model);
}

ここに画像の説明を入力

于 2012-08-13T14:31:42.073 に答える
0

サイト モデルとブランド モデルの両方を含む「ViewModel」を作成できます。次に、ビューをそのモデルにバインドできます。これにより、ビューの任意の部分を基になるモデルの任意の部分にバインドできます。

public class siteViewModel{
    public SiteConfig x;
    public Brand b; //Fill this with all the available brands
}

もちろん、ビューに必要なその他の情報を含めることもできます (ViewBag の必要性も減らします)。

于 2012-08-13T14:06:09.913 に答える