这是我的编辑控制器:
public ActionResult Edit(short id)
{
TAUX taux = db.TAUX.Find(id);
if (taux == null)
{
return HttpNotFound();
}
ViewBag.CAT_ID = new SelectList(db.CATEGORIE, "CAT_ID", "LIBELLE", taux.CAT_ID);
ViewBag.C_GARANT = new SelectList(db.GARANTIE, "C_GARANT", "LIB_ABREGE", taux.C_GARANT);
return PartialView("_Edit",taux);
}
这就是我在观点中称之为的方式:
@Html.ActionLink("Modifier", "Edit", new { id=d.TAUX_ID })
我的模型Taux
:
public partial class TAUX
{
// the first 3 attributes are my primary key
public short CAT_ID { get; set; } // foreign key
public int C_GARANT { get; set; } // foreign key
public int TAUX_ID { get; set; }
[Required(ErrorMessage = "Taux est obligatoire")]
public decimal POURC_TAUX { get; set; }
public System.DateTime DATE_EFFET { get; set; }
public virtual CATEGORIE CATEGORIE { get; set; }
public virtual GARANTIE GARANTIE { get; set; }
}
这就是我得到的错误:
system.ArgumentException:必须传递的主键值的数量 匹配实体上定义的主键值的数量。
所以我试着这样做:
public ActionResult Edit(int taux_id ,int c_garant, short cat_id)
{
TAUX taux = db.TAUX.Find(taux_id, c_garant, cat_id);
... }
//////////
@Html.ActionLink("Modifier", "Edit", new { id=d.TAUX_ID, c_garant=d.C_GARANT, cat_id=d.CAT_ID })
但我遇到了这个问题:
参数字典包含参数的空条目 ' taux_id'非可空类型的System.Int32'方法 ' System.Web.Mvc.ActionResult编辑(Int32,Int32,Int16)'在 ' pfebs0.Controllers.TauxController&#39 ;.可选参数必须是a 引用类型,可空类型,或声明为可选 参数。
如何解决(deleteAction的相同问题)?
答案 0 :(得分:2)
如果我理解你的问题。这三个属性是您的密钥,但不是您的主键,因为我在您的代码中看到您只是添加了注释,以确保CAT_ID
和C_GARANT
是您的外键。
关于第一次尝试。仅含义Taux_ID
是您的主键。
如果您希望扩展方法Find
正常工作,则需要精确定位属性Key
,该属性位于表中属性的主键上。
在你的情况下,你可以:
public partial class TAUX
{
public int TAUX_ID { get; set; }
[Required(ErrorMessage = "Taux est obligatoire")]
public decimal POURC_TAUX { get; set; }
public System.DateTime DATE_EFFET { get; set; }
public short CAT_ID { get; set; } // foreign key
public virtual CATEGORIE CATEGORIE { get; set; }
public int C_GARANT { get; set; } // foreign key
public virtual GARANTIE GARANTIE { get; set; }
}
然后在你的行动中,不要改变:
public ActionResult Edit(int id=0, int cat_Id =0,short c_garant=0)
{
TAUX taux = db.TAUX.Where(p=>p.TAUX_Id==id &&p.CAT_ID==cat_Id && p.C_GARANT==c_garant).FirstOrDefault();
if (taux == null)
{
return HttpNotFound();
}
ViewBag.CAT_ID = new SelectList(db.CATEGORIE, "CAT_ID", "LIBELLE", taux.CAT_ID);
ViewBag.C_GARANT = new SelectList(db.GARANTIE, "C_GARANT", "LIB_ABREGE", taux.C_GARANT);
return PartialView("_Edit",taux);
}
答案 1 :(得分:1)
最简单的尝试是改变
public ActionResult Edit(int taux_id ,int c_garant, short cat_id)
到
public ActionResult Edit(int id ,int c_garant, short cat_id)
并离开
@Html.ActionLink("Modifier", "Edit", new { id=d.TAUX_ID, c_garant=d.C_GARANT, cat_id=d.CAT_ID })
现在
答案 2 :(得分:0)
您在ActionLink
中传递的路线值需要与操作方法中的参数名称相匹配。
将您的ActionLink
更改为:
@Html.ActionLink("Modifier", "Edit", new { taux_id=d.TAUX_ID, c_garant=d.C_GARANT, cat_id=d.CAT_ID })