簡體   English   中英

請求請求編輯操作的模型未由“獲取請求編輯操作”給出的模型填寫

[英]Model for Post Request Edit Action Not being filled in by Model given by Get Request Edit Action

我有一個ProductController,其中包含一個Edit Action GetRequest和一個Edit Action PostRequest。

Edit GetRequest Action根據請求中的路由ID值獲取單個Product實體,並構建一個ProductViewModel。 我有這些的隱式轉換方法。

返回的視圖將使用ProductViewModel的值構建一個ProductEditViewModel:

    // GET: Product/Edit/5
    public async Task<ActionResult> Edit(int? id)
    {

        if (id == null)
        {
            return new HttpStatusCodeResult(HttpStatusCode.BadRequest);
        }
        ProductViewModel product = await db.Products.FindAsync(id);

        var categoryID = db.Categories.Single(c => c.Products.Any(p => p.Id == id)).Id;

        if (product == null)
        {
            return HttpNotFound();
        }
        return View(new ProductEditViewModel { Id = product.Id, Name = product.Name, ByteImage = product.ByteImage, Price = product.Price, CategoryId = categoryID});
    }

運行我的應用程序時,我可以訪問Edit GetRequest頁面,並且可以看到成功顯示了要編輯的產品,但是,當我發回Post請求時,提供給Edit PostRequest Action的ProductEditViewModel為空。 它應該具有Name和Id屬性,因為Image可以保持不變。 這是我的Edit PostRequest Action:

    [HttpPost]
    [ValidateAntiForgeryToken]
    public async Task<ActionResult> Edit([Bind(Include = "Id,Name,Image,Price")] ProductEditViewModel model)
    {

        var oldImage = db.Products.Where(p => p.Id == model.Id).Select(x => x.Image).FirstOrDefault();


        if (ModelState.IsValid)
        {
            Product modifiedProduct = model;

            if(modifiedProduct.Image == null)
            {
                modifiedProduct.Image = oldImage;
            }
            db.Entry(modifiedProduct).State = EntityState.Modified;
            await db.SaveChangesAsync();
            return RedirectToAction("Index/" + model.categoryID);
        }
        return View(model);
    }

我的ProductViewModels:

public class ProductViewModel
    {
        public int Id { get; set; }
        [Required, Display(Name="Product Name")]
        public string Name { get; set; }
        [DataType(DataType.Upload)]
        public HttpPostedFileBase Image { get; set; }
        public string OutputImage { get; set; }
        public Byte[] ByteImage { get; set; }
        [Required]
        public Decimal Price { get; set; } 
        public int CategoryId { get; set; }

        public static byte[] ConvertToByte(ProductViewModel model)
        {
            if (model.Image != null)
            {
                byte[] imageByte = null;
                BinaryReader rdr = new BinaryReader(model.Image.InputStream);
                imageByte = rdr.ReadBytes((int)model.Image.ContentLength);

                return imageByte;
            }

            return null;
        }

        // ViewModel => Model | Implicit type Operator
        public static implicit operator Product(ProductViewModel viewModel)
        {
            var model = new Product
            {
                Id = viewModel.Id,
                Name = viewModel.Name,
                Image = ConvertToByte(viewModel),
                Price = viewModel.Price
            };

            return model;
        }

    // Model => ViewModel | Implicit type Operator
    public static implicit operator ProductViewModel(Product model)
    {
        var viewModel = new ProductViewModel
        {
            Id = model.Id,
            Name = model.Name,
            OutputImage = string.Format("data:image/jpg;base64,{0}", Convert.ToBase64String(model.Image)),
            ByteImage = model.Image,
            Price = model.Price,
            CategoryId = model.Id
        };

        return viewModel;
    }

}

ProductEditViewModel:

public class ProductEditViewModel
{
    public int Id { get; set; }
    [Required, Display(Name = "Product Name")]
    public string Name { get; set; }
    [DataType(DataType.Upload)]
    public HttpPostedFileBase Image { get; set; }
    public string OutputImage { get; set; }
    public byte[] ByteImage { get; set; }
    [Required]
    public decimal Price { get; set; }
    public int? CategoryId { get; set; }

    public static implicit operator ProductViewModel(ProductEditViewModel viewModel)
    {
        var model = new Product
        {
            Id = viewModel.Id,
            Name = viewModel.Name,
            Image = ConvertToByte(viewModel),
            Price = viewModel.Price
        };

        return model;
    }

    public static implicit operator ProductEditViewModel(ProductViewModel viewModel)
    {
        var model = new ProductEditViewModel
        {
            Id = viewModel.Id,
            Name = viewModel.Name,
            ByteImage = ConvertToByte(viewModel),
            Price = viewModel.Price
        };

        return model;
    }



    private static byte[] ConvertToByte(ProductEditViewModel viewModel)
    {

        if (viewModel.Image != null)
        {
            byte[] imageByte = null;
            BinaryReader rdr = new BinaryReader(viewModel.Image.InputStream);
            imageByte = rdr.ReadBytes((int)viewModel.Image.ContentLength);

            return imageByte;
        }

        return null;
    }
}

我沒有ProductEditViewModel的獲取器和設置器能夠分配值。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM