Я хочу удалить строку в своей базе данных с помощью @ Html .ActionLink Delete, но она не работает. Что я делаю не так? - PullRequest
0 голосов
/ 30 мая 2020

Он может записывать cv.name, он также подключается к базе данных. Но я делаю что-то не так с действием удаления.

cs html:

<body>   
@{
    foreach( var cv in Model.GetCVs( username)) 
    {
        <h3 style="color: #193367; "><b> Name: @cv.name</b></h3>     // this works
        <form action="" method="post">
            <input type="submit" name="name" value="@cv.name" />     // this works
        </form>
        @Html.ActionLink("Delete","Delete",new{ id = @cv.id})        // this does not work
    }
}
</body>

Приведенная выше разметка находится в моем файле cs html, и большая часть его работает все в порядке.

cs html .cs:

[BindProperty]
public int id { get; set; }

public const string vv = "Data Source=Tables.sqlite3";

public static SqliteConnection Connection = new SqliteConnection(vv);

static AboutModel()
{
    Connection.Open();
}

public struct CV
{
    public string name;
    public int id;
}

public ActionResult Delete(int? id)
{
    using (var cmd = Connection.CreateCommand()) 
    {
        cmd.CommandText = "Delete from MyTable1 where id = @id;";
        return RedirectToPage("About");                 
    }                   
}

Это код в моем cshtml.cs, а метод Delete не работает. Я не знаю, как правильно использовать это действие delete. Я не хочу, чтобы он спрашивал, действительно ли вы хотите его удалить? Я просто хочу, чтобы, если пользователь нажимает кнопку удаления, он должен удалить эту строку в таблице.

1 Ответ

0 голосов
/ 30 мая 2020

У вас две проблемы. Во-первых, вам нужно добавить в свою команду параметр, который будет соответствовать @id в тексте команды. Во-вторых, что более важно, вам нужно выполнить команду . Прямо сейчас вы просто создаете новый DbCommand, назначаете свойство CommandText, а затем отбрасываете it.

public ActionResult Delete(int? id)
{
    // handle bad request (id is null) somehow
    if(!ModelState.IsValid) 
        return View();

    using (var cmd = Connection.CreateCommand()) 
    { 
        cmd.CommandText = "Delete from MyTable1 where id = @id";

        // set command type Text (or StoredProcedure) 
        // Text is the default so not strictly necessary 
        cmd.CommandType = CommandType.Text; 

        // create new parameter
        var para = cmd.CreateParameter();
        para.Value = id.Value;
        para.ParameterName = "@id";
        para.DbType = DbType.Int32;

        // add parameter to command
        cmd.Parameters.Add(para);

        // need to make sure connection is open
        if (Connection.State == ConnectionState.Closed || Connection.State == ConnectionState.Broken) 
            Connection.Open();

        // execute command
        cmd.ExecuteNonQuery();
    } 

    return RedirectToPage("About");
}

Примечание: вы действительно не должны Не храните объект подключения в поле или свойстве static. Вы должны создавать, открывать, закрывать / удалять как можно ближе к тому месту / когда соединение действительно необходимо. Поскольку это веб-приложение, у вас могут возникнуть проблемы, если вы сделаете это таким образом.

public ActionResult Delete(int? id)
{
    // handle bad request (id is null) somehow
    if(!ModelState.IsValid) 
        return View();

    // create connection when we need it
    using (var conn = new SqliteConnection(vv)) 
    using (var cmd = conn.CreateCommand()) 
    { 
        cmd.CommandText = "Delete from MyTable1 where id = @id";

        // set command type Text (or StoredProcedure) 
        // Text is the default so not strictly necessary 
        cmd.CommandType = CommandType.Text; 

        // create new parameter
        var para = cmd.CreateParameter();
        para.Value = id.Value;
        para.ParameterName = "@id";
        para.DbType = DbType.Int32;

        // add parameter to command
        cmd.Parameters.Add(para);

        // open the connection 
        conn.Open();

        // execute command
        cmd.ExecuteNonQuery();
    } 

    return RedirectToPage("About");
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...