1

私の mvc 3 Web ストア アプリには、Items、Products、Shipping、Users テーブルというモデルがあります。ここで、1 つの Item には 1 つの Product、1 つの User、および 1 つの Shipping が含まれます。どうにかしてアイテムを作成および編集する必要があります。作成すると、「入力するフィールド」をパラメーターとして Crete(Post) メソッドに渡すことができるため、多くの問題はありません。編集には 1 つの問題があります - Null 参照例外が発生します。これが私のコードです:
(コントローラー):
モデル (タイプ Item) をパラメーターとして Edit Post メソッドに渡し、製品と配送を取得します。

    [HttpGet]
    public ViewResult Edit(int itemId)
    {
        Item target = _itemsRepository.GetItem(itemId);

        return View(target);
    }

    [HttpPost]
    public ActionResult Edit(Item model)
    {
        Product p = model.Product;
        Shipping s = model.Shipping;

        // here goes some validation stuff

        if (ModelState.IsValid)
        {
            _productRepository.UpdateProduct(p);
            _shippingRepository.UpdateShipping(s);
            return RedirectToAction("Content");
        }
        return View();
    }    

強く型付けされたビュー (フォームに入力する場所):

@model WebStore.WebStoreModels.Item

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

<fieldset>
    <legend>Product</legend>
    @Html.HiddenFor(i => i.ItemId)

    <p>Name: </p>
    <p>
        @Html.EditorFor(i => i.Product.Name)
        @Html.ValidationMessageFor(i => i.Product.Name)
    </p>
   // and so on
</fieldset>

<fieldset>
    <legend>Shipping</legend>

    <p>Cost: </p>
    <p>
        @Html.EditorFor(i => i.Shipping.Cost)
        @Html.ValidationMessageFor(i => i.Shipping.Cost)
    </p>        
    // so on
</fieldset> 
<p>
    <input type="submit" value="Save"/>
</p>

}

そして、フォームに入力して「安全」ボタンをクリックすると、 UpdateProduct() メソッドの ProductRepository クラスで NullReferenceException が発生します。

public class ProductRepository : IProductRepository
{
    private WebStoreDataContext _dataContext;

    public ProductRepository(WebStoreDataContext dataContext)
    {
        _dataContext = dataContext;
    }

    public Product GetProduct(int productId)
    {
        return _dataContext.Products.SingleOrDefault(p => p.ProductId == productId);
    }
    public void UpdateProduct(Product p)
    {
        var dbProduct = GetProduct(p.ProductId);
        dbProduct.Name = p.Name;   // here the exception occures
        dbProduct.Description = p.Description;
        dbProduct.Price = p.Price;
        dbProduct.Category = p.Category;
        dbProduct.SubCategory = p.SubCategory;
        _dataContext.SubmitChanges();
    }

この割り当てを使用できないようです:

Product p = model.Product;

私も試しました:(ビューで、Edit(Post)メソッドでProductに割り当てます)

TempData["product"] = @Model.Product;  

また:(ビューで)

@Html.Hidden("product", @Model.Product)  

それをパラメータとして Edit(Post) メソッドに渡します。

[HttpGet]
public ViewResult Edit(Product p, Shipping s)  

問題はモデルに関連していると思います。
どんな助けでも素晴らしいでしょう、コードが多すぎて申し訳ありません)

4

1 に答える 1

2

ビューのフォーム内に非表示のProductId入力を追加する必要があります。

@using (Html.BeginForm())
{
    @Html.HiddenFor(i => i.Product.ProductId)
    ...
}

この行が必要な理由は、フォームを送信すると、モデルバインダーがすべての入力(非表示の入力を含む)を調べて、アクションItem modelを渡すプロパティにバインドするためです。[HttpPost]以前は、この行がなかった場合、次のプロパティのみが入力されていました。

  • Item.ItemId
  • Item.Product.Name
  • Item.Shipping.Cost

モデルにItem.Product.ProductIdの値に関する情報がありませんでした。このプロパティはです。これはint、フォームが送信されたときに0に等しくなるようになったことを意味します。メソッド内_productRepository.UpdateProduct(p);でIdで商品を取得しようとしていますが、明らかにid = 0の商品が見つからないため、この呼び出しが返さnullれ、次の行でnull参照例外が発生しました。

于 2012-12-24T23:06:30.163 に答える