来自Razor view mvc4的来电编辑动作

时间:2013-06-12 07:07:02

标签: asp.net-mvc-4

这个问题可能已被多次询问过,但是我的情况不适用,所以请耐心等待。

我的控制器中有以下操作:

    [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”的空条目。可选参数必须是引用类型,可空类型,或者声明为可选参数。 参数名称:参数

我的问题:

  1. 我该如何解决这个问题?
  2. 为什么要调用编辑操作而不是发布编辑?
  3. 如果你能提出更好的方法,可以通过jQuery,ajax或其他任何方式在调用之间调用编辑操作的更好方法是什么?

2 个答案:

答案 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)

劳迪,这是一个烂摊子。您的表单中只有一个链接,该链接指向编辑操作,将调用get,表单将永远不会回发。你想在表格行中做一个表格吗?

@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>   
}

该代码将在一行内进行编辑,但我只是猜测你发布的代码的结构。