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

时间:2013-01-24 11:01:46

标签: c# asp.net-mvc entity-framework

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

    [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

在删除功能之上(它与编辑的功能相同),但仍然没有。

5 个答案:

答案 0 :(得分:2)

<强>问题:

两个按钮都会提交父表单,这在您的解决方案中可能是相同的。

背景资料:

如果您通过按钮提交(与哪一个无关),您的HTML元素就在表单元素中。浏览器将检查forms属性中给出的url。

<强>解决方案:

以单独的形式放置编辑 - 引用编辑网址(使用整个模型) 然后使用ModelID和Delete按钮创建一个单独的表单 - 引用删除URL。 (不是整个模型!)

更改删除功能,因此只需将ModelID作为参数(而不是整个模型)。

关闭你去:)

答案 1 :(得分:1)

这是因为EditDelete按钮都做同样的事情,他们只是发布表单。因此,他们会始终发布到同一个地方

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

像这样:

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

然后在你的行动方法中:

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

否则,您必须使用Javascript根据点击的按钮自动更改表单的帖子URL,这是讨厌

答案 2 :(得分:0)

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

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

我认为没有理由将方法编辑并将ActionName设置为删除。

答案 3 :(得分:0)

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

将表单指向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
        }
    }
}

答案 4 :(得分:0)

尝试使用[HttpDelete]属性