4

私はMVCを初めて使用し、非常に単純な問題であるはずのことに固執しました。私はこのチュートリアルを進めており、外部キー「リンク」(名前がわからない)を追加したいのですが、機能しないように見えることを除いて、すべてがほぼ機能しています。これが私が持っているものです:

テーブル:

 Inventory:
 Id   |  SerialNumber  | ManufacturerId (foreignkey to Manufactueres->id)

 Manufactureres
 Id (primary key)   |  Name

モデル(InventoryItem.cs):

 public class InventoryItem {
     public int Id {get; set; }
     public int SerialNumber{ get; set; }

     //this starts the trouble, I actually want to interact with the Manufactureres table -> Name column
     public int ManufacturerId { get; set; }  
 }

ビュー(Create.cshtml):

 ...
 //What i really want is a dropdown of the values in the Manufactureres table
 @Html.EditorFor(model=> model.ManufacturerId)

リレーショナルデータベースを使用する場合、これはかなり一般的な問題である必要があります。使用/表示される外部キーの関係は多数ありますが、何らかの理由で、非常に単純なものに直接対応するスタックオーバーフローに関するチュートリアルや問題を見つけることができません。任意のガイダンス、または方向性は大歓迎です!ありがとう、

4

3 に答える 3

9

私はあなたの質問を正しく理解することを望みます。新しい在庫アイテムを追加したい場合は、ドロップダウンリストにすべてのメーカーのリストが必要なようです。私はこの仮定に取り組むつもりです、私が軌道に乗っていないかどうか私に知らせてください:)

まず、ビューモデルを作成します。このビューモデルは、youtビューにバインドします。ドメインオブジェクトをビューにバインドしないでください。

public class InventoryItemViewModel
{
     public int SerialNumber { get; set; }

     public int ManufacturerId { get; set; }

     public IEnumerable<Manufacturer> Manufacturers { get; set; }
}

ドメインオブジェクト:

public class InventoryItem
{
     public int Id { get; set; }

     public int SerialNumber{ get; set; }

     public int ManufacturerId { get; set; }
}

public class Manufacturer
{
     public int Id { get; set; }

     public string Name { get; set; }
}

コントローラは次のようになります。

public class InventoryItemController : Controller
{
     private readonly IManufacturerRepository manufacturerRepository;
     private readonly IInventoryItemRepository inventoryItemRepository;

     public InventoryItem(IManufacturerRepository manufacturerRepository, IManufacturerRepository manufacturerRepository)
     {
          // Check that manufacturerRepository and inventoryItem are not null

          this.manufacturerRepository = manufacturerRepository;
          this.inventoryItemRepository = inventoryItemRepository;
     }

     public ActionResult Create()
     {
          InventoryItemViewModel viewModel = new InventoryItemViewModel
          {
               Manufacturers = manufacturerRepository.GetAll()
          };

          return View(viewModel);
     }

     [HttpPost]
     public ActionResult Create(InventoryItemViewModel viewModel)
     {
          // Check that viewModel is not null

          if (!ModelState.IsValid)
          {
               Manufacturers = manufacturerRepository.GetAll()

               return View(viewModel);
          }

          // All validation is cool

          // Use a mapping tool like AutoMapper
          // to map between view model and domain model
          InventoryItem inventoryItem = Mapper.Map<InventoryItem>(viewModel);

          inventoryItemRepository.Insert(inventoryItem);

          // Return to which ever view you need to display
          return View("List");
     }
}

そして、あなたの見解では、あなたは以下を持っているかもしれません:

@model MyProject.DomainModel.ViewModels.InventoryItems.InventoryItemViewModel

<table>
     <tr>
          <td class="edit-label">Serial Number <span class="required">**</span></td>
          <td>@Html.TextBoxFor(x => x.SerialNumber, new { maxlength = "10" })
              @Html.ValidationMessageFor(x => x.SerialNumber)
          </td>
     </tr>
     <tr>
          <td class="edit-label">Manufacturer <span class="required">**</span></td>
          <td>
               @Html.DropDownListFor(
                    x => x.ManufacturerId,
                    new SelectList(Model.Manufacturers, "Id", "Name", Model.ManufacturerId),
                    "-- Select --"
               )
               @Html.ValidationMessageFor(x => x.ManufacturerId)
          </td>
     </tr>
</table>

これがお役に立てば幸いです:)

于 2012-09-21T08:26:16.260 に答える
2

はい、これは一般的な問題です。実際に選択Manufactureresしてから、表示するために送信する必要があります。ViewBagビューモデルを使用するか、厳密に入力することができます。

例:

于 2012-09-20T19:42:06.047 に答える
0

これは私があなたに勧めるものです。

1)メーカーモデルクラスを作成します

public class Manufacturer
{
     public int Id { get; set; }

     public string Name { get; set; }
}

2)次のようにInventoryItemモデルクラスを作成します

public class InventoryItem
{
     public int Id { get; set; }

     public int SerialNumber{ get; set; }

     public int ManufacturerId { get; set; }

[ForeignKey("Id ")]
public Manufacturer Manufacturer{get; set;}

public IEnumerable<Manufacturer> Manufacturer {get;set;}

}

3)DbContextも次のように更新されていることを確認します

public DbSet<InventoryItem> InventoryItem {get;set;}
public DbSet<Manufacturer> Manufacturer{get;set;}

4)コントローラー

[HttpGet]
        public ActionResult Create()
        {
            InventoryItem model = new InventoryItem();
            using (ApplicationDbContext db = new ApplicationDbContext())
            {
                model.Manufacturer= new SelectList(db.Manufacturer.ToList(), "Id", "Name");
            }
            return View(model);
        }

        [HttpPost]
        public ActionResult Create(InventoryItem  model)
        {
            //Check the Model State
            if(! ModelState.IsValid)
            {
                using (ApplicationDbContext db = new ApplicationDbContext())
                {
                    model.Manufacturer= new SelectList(db.Manufacturer.ToList(), "Id", "Name");
                    return View(model);
                }
            }

            using (ApplicationDbContext db = new ApplicationDbContext())
            {
                InventoryItem  dto = new InventoryItem();
                dto.SerialNumber= model.SerialNumber;
                dto.Id= model.Id;

                Manufacturer manudto = db.Manufacturer.FirstOrDefault(x => x.Id== model.Id);
                dto.CatName = manudto.CatName;

                db.Test.Add(dto);
                db.SaveChanges();
            }
                TempData["SM"] = "Added";

                return RedirectToAction("Index");
        }

5)ビューに以下の形式のdropdownselectオプションがあることを確認します

<div class="form-group">
            @Html.LabelFor(model => model.Name, htmlAttributes: new { @class = "control-label col-md-2" })
            <div class="col-md-10">
                @Html.DropDownListFor(model => model.Id, Model.Manufacturer,"Select", new { @class = "form-control" } )
                @Html.ValidationMessageFor(model => model.Id, "", new { @class = "text-danger" })
            </div>
        </div>

これがうまくいくことを願っています:D

于 2020-05-28T09:00:33.180 に答える