2

アプリケーションの同じページから編集機能と削除機能を使用する方法を理解しようとしています。現時点では、私のコントローラーは次のようになっています。

    [HttpPost]
    public ActionResult Edit(CodeTagViewModel codeTagViewModel, FormCollection collection)
    {
        if (ModelState.IsValid)
        {

            List<Tag> tagsToAdd = new List<Tag>();

            codeTagViewModel.Tags = db.Tags.ToList();
            foreach (Tag tag in codeTagViewModel.Tags)
            {
                if (collection[tag.TagID.ToString()].ToString().Contains("true"))
                {
                    tagsToAdd.Add(tag);
                }
            }

            codeTagViewModel.SelectedTags = tagsToAdd;

            Code code = db.Code.Find(codeTagViewModel.CodeID);
            MapModelToCode(codeTagViewModel, code);

            db.Entry(code).State = EntityState.Modified;
            db.SaveChanges();
            return View(codeTagViewModel);
        }
        return RedirectToAction("Index");
    }

    [HttpPost, ActionName("Delete")]
    public ActionResult Edit(CodeTagViewModel codeTagViewModel, FormCollection collection)
    {
        if (ModelState.IsValid)
        {

            List<Tag> tagsToAdd = new List<Tag>();

            codeTagViewModel.Tags = db.Tags.ToList();
            foreach (Tag tag in codeTagViewModel.Tags)
            {
                if (collection[tag.TagID.ToString()].ToString().Contains("true"))
                {
                    tagsToAdd.Add(tag);
                }
            }

            codeTagViewModel.SelectedTags = tagsToAdd;

            Code code = db.Code.Find(codeTagViewModel.CodeID);
            MapModelToCode(codeTagViewModel, code);

            db.Code.Remove(code);
            db.SaveChanges();
            return View(codeTagViewModel);
        }
        return RedirectToAction("Index");
    }

そして、編集ビューに2つのボタンがあります。

    <p>
        <input type="submit" value="Save" />
    </p>
    <p>
        <input type="submit" value="Delete" />
    </p>

そして、私のビューモデルは次のようになります。

public class CodeTagViewModel
{
    public List<Tag> Tags { get; set; }
    public List<Tag> SelectedTags { get; set; }        

    public int CodeID { get; set; }
    public string Title { get; set; }
    public string Description { get; set; }
    public DateTime DateAdded { get; set; }
    public DateTime LastUpdated { get; set; }
    public string Project { get; set; }
    public string CMS { get; set; }
    public int DotNetVersion { get; set; }
    public string Dependencies { get; set; }
    public string Author { get; set; }
    public string CodeFile { get; set; }
    public string TFSLocation { get; set; }

}

現時点では、削除ボタンは何も実行しておらず、コードにまったくヒットしていません。

私はMVCを初めて使用し、MVCがすべての背景情報をどのように処理するかを理解しようとしているので、助けていただければ幸いです。

編集:私はルーティングの側面も調べて、次のように入力しました:

    //
    // POST: /Code/Edit/5

削除機能(編集用のものと同じ)の上にありますが、まだ何もありません。

4

5 に答える 5

2

問題:

両方のボタンが親フォームを送信します。これはおそらくソリューションでも同じです。

背景情報:

ボタンを使用して送信する場合、HTML要素はフォーム要素内にあります(どちらでも構いません)。ブラウザは、forms属性で指定されたURLをチェックします。

解決:

EDITを(モデル全体を含む)編集URLを参照して別のフォームに配置し、ModelIDと[削除]ボタンを使用して削除URLを参照して別のフォームを作成します。(モデル全体ではありません!)

削除の関数を変更して、(モデル全体ではなく)パラメーターとしてModelIDのみが必要になるようにします。

オフあなたが行く:)

于 2013-01-24T13:14:49.663 に答える
1

これは、ボタンEditDeleteボタンの両方が同じことを行うため、フォームを投稿するだけです。したがって、彼らは常に同じ場所に投稿します。

削除ボタンをに変更してから、メソッドをにActionLink変更し、削除するアイテムのIDを渡してから、それを取得して削除する必要があります。DeleteHttpGet

このような:

@Html.ActionLink("Delete", "Delete", "Code", new { CodeID = Model.CodeID })

次に、アクションメソッドで:

[HttpGet]
public ActionResult Delete (int CodeID)
{
   //perform deletion
}

それ以外の場合は、Javascriptを使用して、クリックされたボタンに応じてフォームの投稿URLを自動的に変更する必要があります。これは厄介です。

于 2013-01-24T12:43:06.447 に答える
0

メソッド名をDeleteに変更しようとしましたか?

    [HttpPost]
    public ActionResult Delete(CodeTagViewModel codeTagViewModel, FormCollection collection)
    {...

メソッドEditをnaminし、ActionNameをDeleteに設定する理由はわかりません。

于 2013-01-24T11:13:12.143 に答える
0

[HttpDelete]属性を使用してみてください

于 2013-01-24T12:03:05.780 に答える
0

同じ名前とパラメーターを持つ2つのActionメソッドがあります。コンパイルエラーは発生しませんか?また、ビューには2つの送信ボタンがあります。あなたのフォームはどのアクションを指していますか?

フォームをActionMethod「編集」にポイントします。

送信ボタンに名前属性を追加する

 <p>
    <input type="submit" value="Save" name ="Edit"/>
</p>
<p>
    <input type="submit" value="Delete" name="Remove"/>
</p>

次に、コントローラーアクションメソッドで:

 [HttpPost]
public ActionResult Edit(CodeTagViewModel codeTagViewModel, FormCollection collection)
{
    if (ModelState.IsValid)
    {
       if((collection["Edit"]=="Save") && (collection["Remove"] == null)
        {
           // perform edit operation
        }
        else if((collection["Edit"]== null) && (collection["Remove"] == Delete)
        {
           // perform delete operation
        }
    }
}
于 2013-01-24T11:31:30.713 に答える