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();
    }

編集後のアクションを呼び出して、データをデータベースに更新しようとしています。この目的のために、次のように編集アクションを呼び出しています。

@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.Web.Mvc.ActionResult Edit(Int32)' の null 非許容型 'System.Int32' のパラメーター 'id' の null エントリが含まれています。 Dwiza.Controllers.OrgController'. オプションのパラメーターは、参照型または null 許容型であるか、オプションのパラメーターとして宣言する必要があります。パラメータ名: パラメータ

私の質問:

  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 である(そしてnull可能ではない)という事実は、私が思うにあなたの最初のコードで例外を与えていました。

HTH

編集

コントローラーコードを追加する(注-1つだけを編集する必要があるため、これはまだ少し/かなり奇妙だと思います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 に答える