将删除功能添加到 MVC 中的编辑控制器

本文关键字:编辑 控制器 MVC 删除 功能 添加 | 更新日期: 2023-09-27 17:56:02

我正在尝试弄清楚如何在我的应用程序中从同一页面使用编辑函数和删除函数。目前我的控制器看起来像这样:

    [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");
    }

我的编辑视图中有两个按钮:

    <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的新手,并试图弄清楚它如何处理所有背景内容,因此任何帮助将不胜感激。

编辑:我还研究了路由方面并输入:

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

在删除功能上方(它与编辑功能相同),仍然什么都没有。

将删除功能添加到 MVC 中的编辑控制器

问题:

这两个按钮都提交父窗体,该窗体在您的解决方案中可能相同。

背景资料:

您的 HTML 元素位于表单元素内,如果您通过按钮提交(无论哪个按钮无关紧要)。浏览器将检查表单属性中给出的 URL。

溶液:

将 EDIT 放在单独的表单中 - 引用编辑 URL(包含整个模型)然后创建一个单独的表单 - 引用删除 URL - 带有模型 ID 和删除按钮。(不是整个模型!

更改删除函数,使其只需要 ModelID 作为参数(而不是整个模型)。

你走:)

这是因为EditDelete按钮都做同样的事情,它们只是发布表单。所以他们总是会发帖到同一个地方

您应该将删除按钮更改为ActionLink,然后将Delete方法更改为HttpGet,传入要删除的项目的 ID,然后检索并删除它。

喜欢这个:

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

然后在您的操作方法中:

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

否则,您必须使用Javascript根据单击的按钮自动更改表单的发布URL,这很讨厌

您是否尝试过将方法名称更改为删除?

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

我认为没有理由在方法中命名编辑并将"操作名称"设置为"删除"。

尝试使用 [HttpDelete] 属性

您有两个具有相同名称和参数的操作方法。它不会抛出编译错误吗?同样在视图中,您有两个提交按钮。您的表单指向哪个操作?

将表单指向操作方法"编辑"。

向提交按钮添加名称属性

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