对象引用未设置为MVC3中对象的实例

时间:2012-07-29 09:51:49

标签: asp.net-mvc asp.net-mvc-3 razor

下面是我的包含下拉列表的视图。

@model CommerceSuite.Web.Models.RelocateStock.RelocateStockModel

@Html.ValidationSummary(true)

    <div class="editor-label">
        @Html.LabelFor(model => model.products)
    </div>
    <div class="editor-field">
        @Html.DropDownListFor(model=>model.ProductId,Model.products,"Select Product")<br />
        @Html.ValidationMessageFor(model => model.ProductId)
    </div>

这是我的模特课。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using System.ComponentModel.DataAnnotations;
using CommerceSuite.Web.Models.LocationDetail;
using CommerceSuite.Web.Models.Product;

namespace CommerceSuite.Web.Models.RelocateStock
{
public class RelocateStockModel
{
    public RelocateStockModel()
    {
        products = new List<SelectListItem>();
        Fromlocations = new List<SelectListItem>();
        Tolocations = new List<SelectListItem>();
        product = new ProductModel();
        locationDetail = new LocationDetailModel();
    }

    [HiddenInput(DisplayValue = false)]
    public long ProductStockId { get; set; }

    public long ProductId { get; set; }

    [Display(Name = "Product Id")]
    [Required]
    public IList<SelectListItem> products { get; set; }

    public long LocationFromId { get; set; }

    [Display(Name = "Location From")]
    [Required]
    public IList<SelectListItem> Fromlocations { get; set; }


    public long LocationToId { get; set; }

    [Display(Name = "Location To")]
    [Required]
    public IList<SelectListItem> Tolocations { get; set; }

    [Display(Name="Quantity Shifted")]
    public long Quantity { get; set; }

    public LocationDetailModel locationDetail { get; set; }
    public ProductModel product { get; set; }

}
}

这是我的控制者。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using CommerceSuite.Services;
using CommerceSuite.Web.Models.Product;
using CommerceSuite.Data.Models;
using CommerceSuite.Web.Models.RelocateStock;

namespace CommerceSuite.Web.Controllers
{

public class RelocateStockController : BaseCsController
{
    private readonly IProductService _product;
    private readonly ILocationDetailService _locationDetail;
    private readonly IProductStockService _productStock;

    public RelocateStockController(IProductService product, ILocationDetailService locationDetail, IProductStockService productStock)
    {
        this._productStock = productStock;
        this._product = product;
        this._locationDetail = locationDetail;
    }
    //
    // GET: /RelocateStock/

    private List<SelectListItem> PopulateProductId()
    {
        var productCollection = new SelectList(_product.GetAllProduct(), "ProductId", "Name").ToList();
        return productCollection;
    }

    private List<SelectListItem> PopulateLocation()
    {
        var locationCollection = new SelectList(_locationDetail.GetAllLocationDetail(), "LocationId", "Name").ToList();
        return locationCollection;
    }

    public ActionResult Index()
    {
        return PartialView("_RelocateStockView");
    }

    [HttpGet]
    public ActionResult StockRelocate()
    {
        var model = new RelocateStockModel();
        model.products = PopulateProductId();
        model.Fromlocations = PopulateLocation();
        model.Tolocations = PopulateLocation();
        return PartialView("_RelocateStockView");
    }

    [HttpPost]
    public ActionResult StockRelocate(RelocateStockModel model)
    {
        CommerceSuiteWMDBContext context = new CommerceSuiteWMDBContext();

        var productStockId = (from ProductStock in context.ProductStocks
                             where (ProductStock.ProductId == model.ProductId) && (ProductStock.LocationId == model.LocationFromId)
                             select ProductStock.ProductStockId).SingleOrDefault();

        var proStocksId = (from ProductStock in context.ProductStocks
                        where (ProductStock.ProductId == model.ProductId) && (ProductStock.LocationId == model.LocationToId)
                        select ProductStock.ProductStockId).SingleOrDefault();

        var productStock = _productStock.GetProductStockById(productStockId);

        var ProStock = new ProductStock();
        ProStock.ProductId = model.ProductId;
        var qty = model.Quantity;
        ProStock.LocationId = model.LocationFromId;
        ProStock.PackageId = 10000;
        ProStock.QuantityOnHand = ProStock.QuantityOnHand - qty;
        _productStock.UpdateProductStock(ProStock);
        SuccessNotification("Edited Successfully");
        return RedirectToAction("Index");
    }
}

}

当我尝试运行我的代码时,我在@Html.DropDownListFor的视图中出错了... 它说:

  

对象引用未设置为对象的实例。

这是什么意思?

2 个答案:

答案 0 :(得分:3)

您没有显示您的控制器,所以我想,您不会发送您的模型进行查看。 尝试在控制器中使用此操作方法:

public ActionResult Index() 
{ 
    return View(new RelocateStockModel()); 
} 

更新: 你需要这个动作方法:

public ActionResult StockRelocate()
{
    var model = new RelocateStockModel();
    model.products = PopulateProductId();
    model.Fromlocations = PopulateLocation();
    model.Tolocations = PopulateLocation();
    return PartialView("_RelocateStockView", model);
}

答案 1 :(得分:0)

这意味着某些东西是空的。在视图的该部分放置一个断点,然后将鼠标悬停在每个对象上以找出什么是null。

此外,很难判断你是使用lambda还是Model对象,因为你用小写字母调用了lamba变量“model”。