Почему мой метод не запускается, когда я пытаюсь удалить запись из моей базы данных с помощью строго типизированного представления «Удалить»? - PullRequest
0 голосов
/ 28 февраля 2012

Я в настоящее время озадачен, почему мой метод не работает.Я установил на нем точку останова, потому что подозреваю, что где-то произошел сбой.

Вот мое объяснение:

Я только что запустил новое приложение ASP.NET MVC 2.Я подключил свою домашнюю страницу / страницу указателя к новому строго типизированному представлению, которое я назвал «Категории / Список».Все отображается нормально - категории извлекаются из моей модели Entity Data и помещаются на страницу.Я удалил ссылку «Подробности», которая автоматически создается вместе с представлением.

После этого я добавил строго типизированный вид «Удалить» к категориям / «Удалить».В моем CategoryController у меня есть следующий код (который работает)

      <%: Html.ActionLink("Delete", "DeleteCategory", new { id=item.CategoryID })%>

to:

    /// <summary>
    /// Get rid of a Category
    /// </summary>
    /// <returns>Redirect to ~/Categories/Delete</returns>
    public ActionResult DeleteCategory(int id)
    {
        ViewData.Model = (from c in DataContext.Categories where c.CategoryID == id select c).FirstOrDefault();
        return View("Delete");
    }

My Delete View выглядит так:

<%@ Page Title="" Language="C#" MasterPageFile="~/Views/Shared/Site.Master" Inherits="System.Web.Mvc.ViewPage<PracticeApp.Models.Category>" %>

Delete

<h2>Delete</h2>

<h3>Are you sure you want to delete this?</h3>
<fieldset>
    <legend>Fields</legend>

    <div class="display-label">CategoryID</div>
    <div class="display-field"><%: Model.CategoryID %></div>

    <div class="display-label">Category1</div>
    <div class="display-field"><%: Model.Category1 %></div>

</fieldset>
<% using (Html.BeginForm()) { %>
    <p>
        <input type="submit" value="Delete" /> |
        <%: Html.ActionLink("Back to List", "List") %>
    </p>
<% } %>

ОК.Все это покажется знакомым экспертам MVC.Имейте в виду, я только начал с MVC, и у меня нет очень хороших знаний с Linq Either, поэтому я ожидаю некоторого пламени из моего следующего кода (который даже не работает - цель вопроса - я не знаю, почему этоне запускается!)

Это в моих категорияхКонтроллер

    [HttpPost]
    public ActionResult Delete(Models.Category category)
    {
        foreach (Models.Category c in DataContext.Categories)
        {
            if (c.CategoryID == category.CategoryID)
            {
                DataContext.Categories.DeleteObject(c);
            }
        }
        DataContext.SaveChanges();

        return RedirectToAction("List", "List", "Categories");
    }

Есть идеи, почему мой код отказывается запускаться?Я остановился на первой скобке.Точка останова никогда не достигается.

Ответы [ 3 ]

1 голос
/ 28 февраля 2012

Проблема в том, что ваше действие GET (DeleteCategory) не совпадает с действием POST (Delete).

Поэтому вам нужно указать действие, которое вы хотите вызвать:

<% using (Html.BeginForm("Delete", "Categories")) { %>

Или, если вы не хотите этого делать, вам следует переименовать ваш метод GET, чтобы он был таким же, как метод POST:

// Access this action with /Categories/Delete
public ActionResult Delete(int id)
{
    var model = DataContext.Categories.FirstOrDefault(x => x.CategoryID == id);
    return View(model);
}

[HttpPost]
public ActionResult Delete(Category category)
{
    ...
}

Теперь, поскольку ваши действия GET и POSTименуются одинаково, вы можете использовать помощник BeginForm без аргументов, потому что различие между этими действиями будет основано на HTTP-глаголе, используемом для их вызова:

<% using (Html.BeginForm()) { %>

Как примечание внутри вашей формыу вас нет поля ввода.Поэтому не ожидайте получить что-либо из этой категории, чего ожидает ваше действие POST.Возможно, вам потребуется хотя бы включить скрытое поле, содержащее идентификатор категории, которую вы хотите удалить.

1 голос
/ 28 февраля 2012

Проблема в том, что вы ничего не публикуете в своей форме на странице подтверждения. Поэтому MVC не может связываться с моделью категории.

Чтобы получить идентификатор элемента, который вы хотите удалить, используйте тот же способ, что и в обычном представлении:

[HttpPost]
public ActionResult Delete(int id)
{
     //delete item
}

Когда вы сделаете это, вы, вероятно, получите ошибку, потому что есть два метода с одинаковыми перегрузками. Там я обычно создаю дополнительный параметр и присваиваю ему значение вместе с опубликованной формой, например:

[HttpPost]
public ActionResult Delete(int id, bool confirm)
{
    foreach (Models.Category c in DataContext.Categories)
    {
        if (c.CategoryID == category.CategoryID)
        {
            DataContext.Categories.DeleteObject(c);
        }
    }
    DataContext.SaveChanges();

    return RedirectToAction("List", "List", "Categories");
}

Ваша форма будет выглядеть так:

<% using (Html.BeginForm()) { %>
    <p>
        <input type="submit" value="Delete" /> |
        <%: Html.ActionLink("Back to List", "List") %>
    </p>
    <input type="hidden" name="confirm" value="true" />
<% } %>

Одна вещь, которая всегда помогала мне, это напоминать себе, что MVC-страница (как любая веб-страница) не имеет состояния. Таким образом, ваш текущий запрос ничего не знает о вашем предыдущем запросе. Любые данные, которые вам понадобятся в процессе, вам придется поместить их самостоятельно. Поэтому, если вы хотите связать категорию, вам нужно будет указать данные для категории в вашей форме. Поскольку вы показали модель на странице, это не значит, что эти данные все еще доступны для вашего следующего запроса.

0 голосов
/ 28 февраля 2012

Просто думал, что опубликую свой законченный результат Пбиркофф очень помог со «Скрытым полем», которое, как я забыл, даже существовало, и Дарин помог мне исследовать мою проблему.

    [HttpPost]
    public ActionResult Delete(int CategoryID,FormCollection FC)
    {
        DC.Categories.DeleteObject((from c in DC.Categories where c.CategoryID == CategoryID select c).FirstOrDefault());
        DC.SaveChanges();
        return RedirectToAction("list", "categories");
    }

Это проект отдыха с нуля. DC - это моя модель данных сущности (закороченный DataContext, но это только тренировочное приложение).

Я добавил это в свой вид удаления.

"%>

удалять

<h2>Delete</h2>

<h3>Are you sure you want to delete this?</h3>
<fieldset>
    <legend>Fields</legend>

    <div class="display-label">CategoryID</div>
    <div class="display-field"><%: Model.CategoryID %></div>

    <div class="display-label">Category1</div>
    <div class="display-field"><%: Model.Category1 %></div>

</fieldset>
<% using (Html.BeginForm()) { %>
    <p>
        <input type="submit" value="Delete" /> |
        <%: Html.ActionLink("Back to List", "List") %>
    </p>
    **<input type="hidden" name="CategoryID" value = "<%: Model.CategoryID %>" />**
<% } %>

(скрытое поле. Обратите внимание, что ** не в самом коде. Это указывает на то, что я добавил)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...