2014-12-05 117 views
0

我正在做一个小的形式,允许用户确认他reallly要删除的项目,但我不能让控制器上的ID ...简单的模型数据的HTML表单绑定

@using (Html.BeginForm("Delete", "Home", FormMethod.Post)) 
     { 
      @Resources.Audit.Delete_Ask_Confirmation_Text 
      @Html.HiddenFor(model => model.audit.id) 
      <button type="submit" class="btn btn-warning"> 
       <i class="glyphicon glyphicon-trash spaceAfterIcon"></i> @Resources.Audit.Delete_Ask_Confirmation_Button 
      </button> 
     } 

=>在审计:

public int Id { get; set; } 

的Html

<div> 
    <form action="/Audit/Home/Delete" method="post" novalidate="novalidate">Lore Ipsum 
     <input data-val="true" data-val-number="The field Id must be a number." data-val-required="The Id field is required." id="audit_Id" name="audit.Id" type="hidden" value="2"> 
     <button type="submit" class="btn btn-warning"> 
      <i class="glyphicon glyphicon-trash spaceAfterIcon"></i> Please confirm the delete 
     </button> 
    </form> 
</div> 

控制器:

[HttpPost] 
     public ActionResult Delete(int id) 
     {// always null} 

id参数始终为空。

我试着改变方法签名:

Delete(int audit_Id), 
Delete(int id), 
Delet(string id), 
Delete(string audit_id), 
... 

感谢您的帮助!

+0

是什么问题? – 2014-12-05 14:05:18

+0

@Ahmedilyas:我不能'在控制器上获得id,r总是为null或异常 – clement 2014-12-05 14:05:51

+0

这是因为您有一个模型和一个内部具有该ID的对象。命名/ POST参数名称不正确,因此模型联编程序无法将POST的属性绑定到action方法中的参数。我会打开小提琴手,看看这个参数是作为什么发布的。甚至打开开发人员工具栏,找到该属性的DOM名称,然后在操作方法中使用它。 – 2014-12-05 14:06:30

回答

2

如果您尝试使用表单域和Html帮助器函数,您需要将模型作为Delete控制器方法的参数。刚刚ID是比较正确的,你可以确保它是通过改变你的形式声明,并添加对象表示附加路由值传递:

@using (Html.BeginForm("Delete", "Home", new { id = Model.audit.id }, FormMethod.Post))} 

您也可以删除隐藏的输入类型。

+0

没关系,但为什么比放隐藏的魔法更正确? – clement 2014-12-05 14:20:15

+0

当你只需要id时,我的正确性评论更多的是将整个模型用作控制器中的参数,但只传递id更为正确。无论如何,我不是一个隐藏领域的爱好者,它更有意义(在我的脑海中)以更安宁的方式传递URL中的id。 – DoctorMick 2014-12-05 14:23:33

+0

我同意@DoctorMick,但当您使用防伪标记时,表单可能会变得方便。 – Marthijn 2014-12-05 14:51:06

0

MVC模型绑定通过名称对话处理参数。您隐藏的输入名称是

name="audit.Id" 

所以你动作要

public ActionResult Delete(audit model){ 
    var id = model.id; 
} 

OR

@ DoctorMick的答案。