Mvc Tuple Posting操作未检索选定的下拉列表ID

时间:2014-03-08 11:14:19

标签: asp.net-mvc tuples

我在我的mvc项目中使用元组来显示编辑产品详细信息时与特定产品相关的产品,条形码和库存信息。我正在使用数据库第一种方法和元组我被注册为元组对象的自定义模型绑定器 这是我的观点

    @model Tuple<I3SystemEntityModel.tblProduct, I3SystemEntityModel.tblBarcode,    I3SystemEntityModel.tblStock>

    @{
      ViewBag.Title = "Edit";
     }

   <h2>Edit</h2>


   @using (Html.BeginForm())
  {
    @Html.AntiForgeryToken()

     <div class="form-horizontal">
    <h4>tblProduct</h4>
    <hr />
    @Html.ValidationSummary(true)
    @Html.HiddenFor(model => model.Item1.ProductRNo)
    @Html.HiddenFor(model => model.Item2.BarcodeRno)
    @Html.HiddenFor(model => model.Item3.StockRNo)

    <div class="form-group">
        @Html.LabelFor(model => model.Item1.TillDescription, new { @class = "control-label col-md-2" })
        <div class="col-md-10">
            @Html.EditorFor(model => model.Item1.TillDescription)
            @Html.ValidationMessageFor(model => model.Item1.TillDescription)
        </div>
    </div>

    <div class="form-group">
        @Html.LabelFor(model => model.Item1.ProductQty, new { @class = "control-label col-md-2" })
        <div class="col-md-10">
            @Html.EditorFor(model => model.Item1.ProductQty)
            @Html.ValidationMessageFor(model => model.Item1.ProductQty)
        </div>
    </div>

    <div class="form-group">
        @Html.LabelFor(model => model.Item1.ProductFullDescription, new { @class = "control-label col-md-2" })
        <div class="col-md-10">
            @Html.EditorFor(model => model.Item1.ProductFullDescription)
            @Html.ValidationMessageFor(model => model.Item1.ProductFullDescription)
        </div>
    </div>

    <div class="form-group">
        @Html.LabelFor(model => model.Item1.AgeLimit, new { @class = "control-label col-md-2" })
        <div class="col-md-10">
            @Html.EditorFor(model => model.Item1.AgeLimit)
            @Html.ValidationMessageFor(model => model.Item1.AgeLimit)
        </div>
    </div>

    <div class="form-group">
        @Html.LabelFor(model => model.Item1.CostPrice, new { @class = "control-label col-md-2" })
        <div class="col-md-10">
            @Html.EditorFor(model => model.Item1.CostPrice)
            @Html.ValidationMessageFor(model => model.Item1.CostPrice)
        </div>
    </div>

    <div class="form-group">
        @Html.LabelFor(model => model.Item1.NewSalesPrice, new { @class = "control-label col-md-2" })
        <div class="col-md-10">
            @Html.EditorFor(model => model.Item1.NewSalesPrice)
            @Html.ValidationMessageFor(model => model.Item1.NewSalesPrice)
        </div>
    </div>

    <div class="form-group">
        @Html.LabelFor(model => model.Item1.EffectiveDate, new { @class = "control-label col-md-2" })
        <div class="col-md-10">
            @Html.EditorFor(model => model.Item1.EffectiveDate)
            @Html.ValidationMessageFor(model => model.Item1.EffectiveDate)
        </div>
    </div>

    <div class="form-group">
        @Html.LabelFor(model => model.Item1.EndDate, new { @class = "control-label col-md-2" })
        <div class="col-md-10">
            @Html.EditorFor(model => model.Item1.EndDate)
            @Html.ValidationMessageFor(model => model.Item1.EndDate)
        </div>
    </div>

    <div class="form-group">
        @Html.LabelFor(model => model.Item1.ProductComment, new { @class = "control-label col-md-2" })
        <div class="col-md-10">
            @Html.EditorFor(model => model.Item1.ProductComment)
            @Html.ValidationMessageFor(model => model.Item1.ProductComment)
        </div>
    </div>

    <div class="form-group">
        @Html.LabelFor(model => model.Item1.ProductAtribute, new { @class = "control-label col-md-2" })
        <div class="col-md-10">
            @Html.EditorFor(model => model.Item1.ProductAtribute)
            @Html.ValidationMessageFor(model => model.Item1.ProductAtribute)
        </div>
    </div>

    <div class="form-group">
        @Html.LabelFor(model => model.Item1.ProductOrder, new { @class = "control-label col-md-2" })
        <div class="col-md-10">
            @Html.EditorFor(model => model.Item1.ProductOrder)
            @Html.ValidationMessageFor(model => model.Item1.ProductOrder)
        </div>
    </div>

    <div class="form-group">
        @Html.LabelFor(model => model.Item1.VatRNo, "VatRNo", new { @class = "control-label col-md-2" })
        <div class="col-md-10">
            @Html.DropDownList("VatRNo", String.Empty)
            @Html.ValidationMessageFor(model => model.Item1.VatRNo)
        </div>
    </div>

    <div class="form-group">
        @Html.LabelFor(model => model.Item1.DepartmentRNo, "DepartmentRNo", new { @class = "control-label col-md-2" })
        <div class="col-md-10">
            @Html.DropDownList("DepartmentRNo", String.Empty)
            @Html.ValidationMessageFor(model => model.Item1.DepartmentRNo)
        </div>
    </div>

这是我的控制器与编辑相关的操作。

       public  ActionResult Edit(int? id)
       {
        if (id == null)
        {
            return new HttpStatusCodeResult(HttpStatusCode.BadRequest);
        }

        tblProduct tblproduct = db.tblProducts.Find(id);
        tblBarcode tblBarcode = db.tblBarcodes.Where(d => d.ProductRNo == id).FirstOrDefault();
        tblStock tblStock = db.tblStocks.Where(d => d.ProductRNo == id).FirstOrDefault();                  
        Tuple<tblProduct, tblBarcode, tblStock> tupleProduct = 
            new Tuple<tblProduct, tblBarcode, tblStock>(tblproduct, tblBarcode,tblStock);

        if (tblproduct == null)
        {
            return HttpNotFound();
        }
        ViewBag.DepartmentRNo = new SelectList(db.tblDepartments, "DepartmentRNo", "DepartmentDiscription", tblproduct.DepartmentRNo);
        ViewBag.SubDepatmenRNo = new SelectList(db.tblSubDepartments, "SubDepatmenRNo", "SubDeparmentDiscription", tblproduct.SubDepatmenRNo);
        ViewBag.VatRNo = new SelectList(db.tblVats, "VatRNo", "VatCode", tblproduct.VatRNo);
        ViewBag.BarcodeTypeRNo = new SelectList(db.tblBarcodeTypes, "BarcodeTypeRNo", "BarcodeType", tblBarcode.BarcodeTypeRNo);
                    return View(model:tupleProduct);
    }


    // POST: /Product/Edit/5
    // To protect from overposting attacks, please enable the specific properties you want to bind to, for 
    // more details see http://go.microsoft.com/fwlink/?LinkId=317598.
    [HttpPost]
    [ValidateAntiForgeryToken]
    public async Task<ActionResult> Edit(Tuple<tblProduct, tblBarcode, tblStock> tupleProduct)
    {
        try
        {
            if (ModelState.IsValid)
            {
                db.Entry(tupleProduct.Item1).State = System.Data.Entity.EntityState.Modified;
                tupleProduct.Item2.ProductRNo = tupleProduct.Item1.ProductRNo;
                db.Entry(tupleProduct.Item2).State = System.Data.Entity.EntityState.Modified;
                tupleProduct.Item3.ProductRNo = tupleProduct.Item1.ProductRNo;
                db.Entry(tupleProduct.Item3).State = System.Data.Entity.EntityState.Modified;
                db.SaveChanges();
                return RedirectToAction("Index");
            }
            ViewBag.DepartmentRNo = new SelectList(db.tblDepartments, "DepartmentRNo", "DepartmentDiscription", tupleProduct.Item1.DepartmentRNo);
            ViewBag.SubDepatmenRNo = new SelectList(db.tblSubDepartments, "SubDepatmenRNo", "SubDeparmentDiscription", tupleProduct.Item1.SubDepatmenRNo);
            ViewBag.VatRNo = new SelectList(db.tblVats, "VatRNo", "VatCode", tupleProduct.Item1.VatRNo);
            ViewBag.BarcodeTypeRNo = new SelectList(db.tblBarcodeTypes, "BarcodeTypeRNo", "BarcodeType", tupleProduct.Item2.BarcodeTypeRNo);


            return View(tupleProduct);
        }
        catch (DbEntityValidationException dbEx)
        {

        return View();
    }

`

但是当我编辑产品并发布到控制器时,外键发生异常。因为 dropdownlist id没有使用元组对象发布。没有创建自定义视图模型,建议欣赏。

我在调试DepartmentRno = 0时屏幕截图(它没有设置)

我现在无法附上屏幕截图: - (

1 个答案:

答案 0 :(得分:0)

如果你看一下元组implementation,你会发现它没有任何无参数构造函数,MVC模型绑定适用于无参数构造函数。所以你不能在MVC模型绑定中使用Tuple。