1

在我的 mvc 3 网络商店应用程序中,我有这个模型:Items、Products、Shipping、Users 表,其中 1 个 Item 包含 1 个 Product、1 个 User 和 1 个 Shipping。我需要以某种方式创建和编辑项目。通过创建没有太多问题,因为我可以将“要填充的字段”作为参数传递给 Crete(Post) 方法。编辑存在一个问题 - 发生空引用异常。这是我的代码:(
控制器):
我将模型(项目类型)作为参数传递给 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>

}

当我填写表格并单击“安全”按钮时,NullReferenceException 发生在 UpdateProduct() 方法的 ProductRepository 类中:

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

您需要在 View 的表单内添加隐藏的 ProductId 输入:

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

您需要此行的原因是,当您提交表单时,模型绑定器会查看每个输入(包括隐藏输入)并将它们绑定到Item model您传递的[HttpPost]操作的属性。之前,当您没有此行时,仅填充了以下属性:

  • 项目.ItemId
  • 项目.产品.名称
  • 货品.运费.成本

您的模型没有关于 Item.Product.ProductId 值的信息。这个属性是int,这意味着提交表单时它变为等于 0。在您的_productRepository.UpdateProduct(p);方法中,您试图通过 Id 获取产品,显然它找不到 id = 0 的产品,这就是为什么此调用返回null导致下一行出现空引用异常的原因。

于 2012-12-24T23:06:30.163 回答