这个问题可能已被多次询问过,但是我的情况不适用,所以请耐心等待。
我的控制器中有以下操作:
[HttpPost]
public ActionResult Edit(Organization obj)
{
if (ModelState.IsValid)
{
OrgRepo.Update(obj);
return RedirectToAction("Details");
}
else
return View();
}
public ActionResult Edit(int id)
{
return View();
}
我正在尝试通过调用post edit action将数据更新到数据库中。 为此,我调用编辑操作如下:
@foreach (var item in Model) {
var test = item.PartyId;
<tr id="@test">
<td class ="txt">
<input type="text"class="txt" value="@Html.DisplayFor(modelItem => item.Caption)"/>
</td>
<td class ="txt">
<input type="text"class="txt" value="@Html.DisplayFor(modelItem => item.NameInUse)"/>
</td>
<td class ="txt">
<input type="text"class="txt" value="@Html.DisplayFor(modelItem => item.Description )"/>
</td>
<td>
@using (Html.BeginForm())
{
@Html.ActionLink("Edit", "Edit", "Org", null, new { @obj = item })
}
</td>
</tr>
然而,当我点击编辑时,我会遇到异常: 参数字典包含“Nwiza.Controllers.OrgController”中方法“System.Web.Mvc.ActionResult Edit(Int32)”的非可空类型“System.Int32”的参数“id”的空条目。可选参数必须是引用类型,可空类型,或者声明为可选参数。 参数名称:参数
我的问题:
答案 0 :(得分:2)
@Html.ActionLink
生成一个只能用于调用GET的标记。切换到提交按钮以获得POST。
通常使用编辑,您只是编辑一个简单的模型而不是页面上的集合,但是使用您拥有的内容,将cshtml更改为:
@model ICollection<Organization>
<table>
@foreach (var item in Model)
{
using (Html.BeginForm())
{
var test = item.PartyId;
<tr id="@test">
<td class="txt">
<input type="text" name="Caption" class="txt" value="@item.Caption"/>
</td>
<td class="txt">
<input type="text" name="NameInUse" class="txt" value="@item.NameInUse"/>
</td>
<td class="txt">
<input type="text" name="Description" class="txt" value="@item.Description" />
</td>
<td>
<input type="hidden" name="PartyId" value="@item.PartyId"/>
<button type="submit">Edit</button>
</td>
</tr>
}
}
</table>
现在每个表行都被一个表单包裹,这意味着提交按钮将发布该数据。输入上的name
属性将使MVC模型绑定器正确地将发布的值绑定到模型。
最后的隐藏输入将确保您的PartyId值被回发。它在int(而不是nullable)的事实是我想你的初始代码给出了异常。
HTH
修改强>
添加控制器代码(注意 - 我仍然认为这有点/很奇怪,因为你应该只编辑一个Organisation
......
public ActionResult Edit(int id)
{
// get your organisations from your orgRepo... I'm mocking that out.
var orgs = new List<Organization> { new Organization { PartyId = 1, Description = "Org 1", Caption = "Caption 1", NameInUse = "Name 1"},
new Organization { PartyId = 2, Description = "Org 2", Caption = "Caption 2", NameInUse = "Name 2"}};
return View(orgs);
}
答案 1 :(得分:0)
@foreach (var item in Model) {
var test = item.PartyId;
<tr>
<td colspan ="4>
@using (Html.BeginForm("Edit", "Org", FormMethod.Post))
{
@Html.HiddenFor(modelItem => item.PartyId)
<table>
<tr id="@test">
<td class ="txt">
<input type="text"class="txt" value="@Html.DisplayFor(modelItem => item.Caption)"/>
</td>
<td class ="txt">
<input type="text"class="txt" value="@Html.DisplayFor(modelItem => item.NameInUse)"/>
</td>
<td class ="txt">
<input type="text"class="txt" value="@Html.DisplayFor(modelItem => item.Description )"/>
</td>
<td>
<input type="submit" value="edit" />
</td>
</tr>
</table>
}
</td>
</tr>
}
该代码将在一行内进行编辑,但我只是猜测你发布的代码的结构。