C# 在MVC中向我的编辑控制器添加删除功能

C# 在MVC中向我的编辑控制器添加删除功能,c#,asp.net-mvc,entity-framework,C#,Asp.net Mvc,Entity Framework,我正试图弄清楚如何在我的应用程序中从同一个页面上拥有编辑功能和删除功能。此时,我的控制器如下所示: [HttpPost] public ActionResult Edit(CodeTagViewModel codeTagViewModel, FormCollection collection) { if (ModelState.IsValid) { List<Tag> tagsToAdd = new L

我正试图弄清楚如何在我的应用程序中从同一个页面上拥有编辑功能和删除功能。此时,我的控制器如下所示:

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

}

上面的删除功能(与编辑功能相同)仍然没有任何内容。

您是否已将方法名称更改为删除

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

我看不出有任何理由在方法编辑和设置ActionName以删除中使用Nam。

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

将表单指向ActionMethod“Edit”

向提交按钮添加名称属性

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

尝试使用属性

,这是因为
编辑
删除
按钮都做相同的事情,它们只是发布表单。因此,他们将始终发布到相同的位置

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

像这样:

@Html.ActionLink("Delete", "Delete", "Code", new { CodeID = Model.CodeID })
然后在你的行动方法中:

 [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
        }
    }
}
[HttpGet]
public ActionResult Delete (int CodeID)
{
   //perform deletion
}

否则,您必须使用Javascript根据单击的按钮自动更改表单的post URL,这是一个问题:

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

背景信息:

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

解决方案:

以单独的形式进行编辑-引用编辑url(整个模型) 然后用ModelID和delete按钮创建一个单独的表单,并引用deleteURL。(不适用于整个模型!)

更改delete函数,这样它只需要ModelID作为参数(而不是整个模型)


关闭:)

是否按应有的方式保存工作?保存工作,编辑工作,但问题是编辑的删除部分未命中。您可以发布保存方法以进行比较吗?如果页面刷新,您可以尝试在删除方法
返回重定向操作(“索引”)的这一行上设置断点吗并查看是否击中了那个。可能是你的if语句没有实现。是的,它没有被击中,这就是我最初设置断点的地方。编辑在上面,而且很有效,我想这会是一个更好的比较,因为它是我正在处理的实际页面。是的,我也尝试过这个,但仍然没有达到代码要求。只是刷新页面,当它们都被编辑时,我将其更改为删除,试图使其工作,但没有效果。正如我所说,我真的不知道MVC如何在后台链接它们,所以我不知道如何命名,以便视图会发现它似乎没有什么不同了解您的基本知识…^^[HTTPDelete]对API很好,但对于.Net MVC,您主要需要[HTTPPost](提交内容)和[HTTPGet]->获取内容。您的意思是在我的视图底部有这样的内容吗@使用(Html.BeginForm()){

}是的,但是您还需要添加模型的键。然后别忘了编辑你的方法,要求modelId作为唯一的参数,而不是整个viewmodel:)我试过使用:@Html.ActionLink(“Delete”,“CodeController”,“Delete”,new{CodeID=Model.CodeID}),我得到一个404,因为找不到资源。我还试过使用:@Html.ActionLink(“Delete”,“Delete”,new){CodeID=Model.CodeID})并以错误结束:参数字典包含方法“System.Web.Mvc.ActionResult Delete”(Int32)的非空类型“System.Int32”的参数“id”的空条目“在”存储的.Controllers.CodeController“中”。可选参数必须是引用类型、可为空的类型,或者声明为可选参数。@Kayra您有点错误。去掉单词
Controller
。另外
action
位于Controller之前,因此您需要
@Html.ActionLink(“删除”、“删除”、“代码”),新建{CodeID=Model.CodeID})
@Kayra确保动作链接和动作方法中的参数名都是CodeID(大小写很重要).@Kayra如果它们相同,则可能与默认路由冲突,请尝试将操作链接参数和操作方法参数更改为调用
id
,以匹配默认路由。
@Html.ActionLink("Delete", "Delete", "Code", new { CodeID = Model.CodeID })
[HttpGet]
public ActionResult Delete (int CodeID)
{
   //perform deletion
}