ASP.NET MVC验证从控制器到Ajax的查询

时间:2018-11-07 02:27:30

标签: mysql ajax asp.net-mvc

当前,我对表有一个插入查询,并且如果数据已经存在于表中,我不知道如何验证它。

因此,到目前为止,我仅使用try-catch来处理重复的条目。我只是想知道是否可以返回一些文本,如果值被捕获,则将其显示为我的警报或其他内容。

这是我对控制器的查询:

 public ActionResult AddUser(int id, string name, string age)
 {
        string constr = ConfigurationManager.ConnectionStrings["ConString"].ConnectionString;

        using (MySqlConnection con = new MySqlConnection(constr))
        {
            string sqlQuery = "INSERT INTO myTable (id, name, age) VALUES (@id, @name, @age)";
            MySqlCommand cmd = new MySqlCommand(sqlQuery, con);
            cmd.Parameters.AddWithValue("@id", id);
            cmd.Parameters.AddWithValue("@name", name);
            cmd.Parameters.AddWithValue("@age", age);

            con.Open();

            try {
                cmd.ExecuteNonQuery();
                con.Close();
                return RedirectToAction("Index");
            }
            catch (Exception )
            {
                con.Close();
                return this.Json("This Data already exist on table");
            }
        }
    }

这是我用来读取控制器查询的脚本:

 function add(id, name, age) {

        var result = confirm("Are you want to add " + name + " to list?");
        if (result == true) {

            $.ajax({
                url: '/Home/AddUser',
                type: 'POST',
                data: {
                    'id': id,
                    'name': name,
                    'age': age,
                },
                success: function (data) {                                                    
                    alert('Data has been successfully added');
                },
                error: function (jqXhr, textStatus, errorThrown) {
                    alert(errorThrown);
                }
            });
        }
    }

到目前为止,我可以成功地将其插入到表中,但是如果已经存在并且是重复项,则不会执行任何操作,因此,如果用户已经添加或不存在,则不会出现提示。

任何建议或评论。 TIA。

2 个答案:

答案 0 :(得分:0)

考虑在数据库表中创建约束(该列上的唯一约束)。这将防止保存任何重复的记录,即使它通过了与数据库通信的C#代码也是如此。

在执行INSERT语句之前,添加检查以查看记录exist是否存在。您可以编写一条在插入步骤之前进行检查的SQL语句。可能是具有此SQL脚本的存储过程,可以执行此操作,并且您可以从c#方法中调用该存储过程。

如果从Ajax代码调用重定向响应,则没有任何意义。考虑返回一个JSON结构,该结构可以告诉客户端代码记录是否已成功插入,发现重复项或代码崩溃。

这是一个快速且简单的示例,在这里我调用UserExist方法,该方法检查是否存在具有指定名称的记录。如果返回false,我将继续执行我要尝试插入的代码。如果使用存储过程,则也可以在其中添加记录是否存在检查。

[HttpPost]
public ActionResult AddUser(int id, string name, string age)
{
    try 
    {
       // your existing code to insert record to db
       // Check record exist
       if(UserExist(name))
       {
          return Json(new { status="failed", message = "Name exist"});
       }
       // name does not exist. Try to call the Insert code now.

       return Json(new { status="success", message = "Successfully saved"});
    }
    catch (SqlException exs)
    {
       // Check exs to see whether this was caused by unique constraint violation
       return Json(new { status="error", message = "User exist"});
    }
    catch (Exception ex)
    {
       // to do : log the exception
       return Json(new { status="error", message = "Error in saving"});
    }
}
private bool UserExist(string name)
{
   // to do: check record exist in db 
   // You may use ExecuteScalar method if you use raw ADO.NET
   // to do : return boolean value.
}

并在您的success处理程序中,检查响应json的status属性,并向用户显示适当的消息

success:function(data)
{
  if(data.status==="success")
  {
      alert("Saved successfully");
  }
  else if(data.status==="failed")
  {
      alert(data.message);
  }
}

当您尝试插入重复记录时,可以将JSON对象的status属性设置为failed

您可以将specific exceptions用于异常处理部分,当在数据库级别违反唯一键约束时可以捕获异常。在该catch块中也向用户发送一条消息。

答案 1 :(得分:0)

您可以做的第一步是创建一个存储过程,该存储过程的输出参数可以显示插入状态,当发现重复数据时,存储参数必须有所不同:

DELIMITER //
CREATE PROCEDURE AddUser(in @id int, @name varchar(50), @age int, out @status varchar(20))
AS
BEGIN
    -- check if duplicate exists
    IF (SELECT EXISTS (SELECT 1 FROM myTable WHERE name = @name))
        BEGIN
           -- duplicate exist, no insertion to table
           SET @status = 'duplicate';
        END
    ELSE
        BEGIN
           INSERT INTO myTable (id, name, age) VALUES (@id, @name, @age)
           SET @status = 'success';
        END
    END
END
//
DELIMITER ;

然后,使用MySqlCommand中的存储过程名称并使用其输出参数返回状态字符串:

[HttpPost]
public ActionResult AddUser(int id, string name, string age)
{
    string constr = ConfigurationManager.ConnectionStrings["ConString"].ConnectionString;
    using (MySqlConnection con = new MySqlConnection(constr))
    {
        string sqlQuery = "AddUser";
        MySqlCommand cmd = new MySqlCommand(sqlQuery, con);
        cmd.CommandType = CommandType.StoredProcedure;
        cmd.Parameters.AddWithValue("@id", id);
        cmd.Parameters.AddWithValue("@name", name);
        cmd.Parameters.AddWithValue("@age", age);
        cmd.Parameters.Add("@status", MySqlDbType.VarChar).Direction = ParameterDirection.Output;
        con.Open();
        try 
        {
            cmd.ExecuteNonQuery();
            con.Close();
            return Json(new { status = (string)cmd.Parameters["@status"].Value });
        }
        catch (MySqlException ex)
        {
            con.Close();
            return Json(new { status = "error", message = ex.Message });
        }
        catch (Exception e)
        {
            con.Close();
            return Json(new { status = "error", message = e.Message });
        }

    }
}

然后您可以根据AJAX回调中的当前状态输出消息:

$.ajax({
    url: '/Home/AddUser',
    type: 'POST',
    data: {
       'id': id,
       'name': name,
       'age': age,
    },
    success: function (data) {
        if (data.status === "success")
        {
            alert("Data has been successfully added");
        }
        else if (data.status === "duplicate")
        {
            alert("This Data already exist on table");
        }
        else if (data.status === "error")
        {
            alert(data.message);
        }
    }
    error: function (xhr, status, err) {
        // error handling
    }
}

如果您不想使用上述的SELECT查询进行检查,请考虑通过应用UNIQUE constraint来更改表,并检查MySqlException中的错误代码1062:

ALTER TABLE myTable ADD CONSTRAINT UNIQUE (name);