1

はっきりさせようと思います。MVC 4 と Entity Framework に基づく Web アプリケーションを開発しています。このアプリを使用して、製品タイプである他のテーブルに依存するいくつかの製品を作成できます。

@model BuSIMaterial.Models.Product
@{
    ViewBag.Title = "Create";
}
<h2>
    Create</h2>
@using (Html.BeginForm())
{
    @Html.ValidationSummary(true)

    <fieldset>
        <legend>Product</legend>
        <div class="editor-label">
            Purchase date :
        </div>
        <div class="editor-field">
            @Html.TextBoxFor(model => model.PurchaseDate, new { @class = "datepicker"})
            @Html.ValidationMessageFor(model => model.PurchaseDate)
        </div>
        <div class="editor-label">
            Serial number :
        </div>
        <div class="editor-field">
            @Html.TextBoxFor(model => model.SerialNumber, new { maxlength = 50 })
            @Html.ValidationMessageFor(model => model.SerialNumber)
        </div>
        <div class="editor-label">
            Product type :
        </div>
        <div class="editor-field">
            @Html.DropDownList("Id_ProductType", String.Empty)<a href="../ProductType/Create">Add
                a new product type?</a>
            @Html.ValidationMessageFor(model => model.Id_ProductType)
        </div>
        <div class="form-actions">
          <button type="submit" class="btn btn-primary">Create</button>
        </div>
    </fieldset>
}

また、作成した製品タイプ ビューには、既存の製品会社のドロップダウン リストがあります (したがって、製品と製品タイプの間に存在するのと同じ関係:

@model BuSIMaterial.Models.ProductType

@{
    ViewBag.Title = "Create";
}

<h2>Create</h2>

@using (Html.BeginForm()) {
    @Html.ValidationSummary(true)

    <fieldset>
        <legend>ProductType</legend>

        <div class="editor-label">
            Model : 
        </div>
        <div class="editor-field">
            @Html.TextBoxFor(model => model.Model, new { maxlength = 50 })
            @Html.ValidationMessageFor(model => model.Model)
        </div>

        <div class="editor-label">
            Catalog Price : 
        </div>
        <div class="editor-field">
            @Html.EditorFor(model => model.CatalogPrice)
            @Html.ValidationMessageFor(model => model.CatalogPrice)
        </div>

        <div class="editor-label">
            Company : 
        </div>
        <div class="editor-field">
            @Html.DropDownList("Id_ProductCompany", String.Empty)<a href ="../ProductCompany/Create" >Add a new company?</a>
            @Html.ValidationMessageFor(model => model.Id_ProductCompany)
        </div>

        <div class="form-actions">
          <button type="submit" class="btn btn-primary">Create</button>
        </div>
    </fieldset>
}

私が試したのは、これら 2 つのビューを 1 つのCreate Product Viewに「混在」させることです。それで、私の行動が少し変わると思います。また、データベースに 2 つの追加を行う必要があると思います。それは私がやりたいことをするための最良の方法ですか?

更新:ビューモデルを使用して、私はこれを得ました:

私のビューモデル:

public class ProductViewModel
{
    [Required]
    public Product Product { get; set; }
    [Required]
    public ProductType ProductType { get; set; }
}

私の作成アクション:

[HttpPost]
public ActionResult CreateFullProduct(ProductViewModel pvm)
{
    ViewBag.Id_ProductCompany = new SelectList(db.ProductCompanies, "Id_ProductCompany", "Name", pvm.ProductType.Id_ProductCompany);

    if (ModelState.IsValid)
    {
        Product product = new Product { PurchaseDate = pvm.Product.PurchaseDate, 
                                        SerialNumber = pvm.Product.SerialNumber,
                                        Id_ProductType = pvm.ProductType.Id_ProductType};

        ProductType productType = new ProductType {Model = pvm.ProductType.Model,
                                                   CatalogPrice = pvm.ProductType.CatalogPrice,
                                                   Id_ProductCompany = pvm.ProductType.Id_ProductCompany};

        db.ProductTypes.AddObject(productType);
        db.Products.AddObject(product);
        db.SaveChanges();
        return RedirectToAction("Index", "Person");       

    }

    return View(pvm);
}

新しいエントリを保存しようとすると、次の問題が発生しました。The INSERT statement conflicted with the FOREIGN KEY constraint "FK_bm_ProductTypes_bm_ProductCompanies".

4

1 に答える 1

1

Productsに「依存」しているためProductTypes、それらを 1 つにマージすることをお勧めします。post アクションもマージする必要があります。これにより、データベースに 2 つの挿入が行われます (これは正しいProductですProductType

ビューで使用できるように、両方を1つのモデルにも配置する必要があります。

public class ProductViewModel
{
    public Product Product { get; set; }
    public ProductType ProductType { get; set; }
}

編集: 節約に関する問題は、(チャットで示されているように) ProductComany が投稿されていないためです。

これを修正するには、最初にドロップダウンの値をモデルに入れます。

public class ProductViewModel
{
    public Product Product { get; set; }
    public ProductType ProductType { get; set; }
    public List<SelectListItem> ProductCompanies { get; set; }
}

次に、次のようにしてHttpGetandに入力しますHttpPost

model.ProductCompanies = db.ProductCompanies
    .ToList()
    .Select(s => new SelectListItem
    {
        Text = s.Name,
        Value = s.Id.ToString()
    })
    .ToList();

次に、ビューで次のことができます。

@Html.DropDownListFor(m => m.ProductType.Id_ProductCompany, Model.ProductCompanies)
于 2013-04-18T09:04:10.823 に答える