0

这个问题可能已经被问过好几次了,但是在我的情况下它不起作用,所以请多多包涵。

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

    [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 操作将数据更新到数据库中。为此,我将编辑操作称为如下:

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

但是,当我单击编辑时,出现异常:参数字典包含非可空类型“System.Int32”的参数“id”的空条目,用于方法“System.Web.Mvc.ActionResult Edit(Int32)”中的“ Dwiza.Controllers.OrgController'。可选参数必须是引用类型、可空类型或声明为可选参数。参数名称:参数

我的问题:

  1. 我怎样才能解决这个问题?
  2. 为什么它得到编辑操作被调用而不是发布编辑?
  3. 如果您可以建议更好的方法来调用通过 jQuery 或 ajax 或任何其他方法调用编辑操作,有哪些更好的方法?
4

2 回答 2

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 中(并且不可为空)的事实使您的初始代码出现异常。

高温高压

编辑

添加控制器代码(注意 - 我仍然认为这有点/很奇怪,因为你应该只编辑一个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);
}
于 2013-06-12T08:03:50.003 回答
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>   
}

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

于 2013-06-12T08:01:44.013 回答