Есть ли способ вызвать мою функцию вставки из контроллера, используя мой javascript из представления
Вот мой контроллер:
public ActionResult Update(int a, string b)
{
string constr = ConfigurationManager.ConnectionStrings["ConString"].ConnectionString;
using (MySqlConnection con = new MySqlConnection(constr))
{
MySqlCommand cmd = new MySqlCommand("UPDATE MyTable SET a = @a WHERE b = @b ", con);
//cmd.CommandType = CommandType.StoredProcedure;
cmd.Parameters.AddWithValue("@a", a);
cmd.Parameters.AddWithValue("@b", b);
con.Open();
cmd.ExecuteNonQuery();
con.Close();
}
return RedirectToAction("Index");
}
А вот мой javascript, содержащий значения из HTML.
function SaveChanges() {
var a = document.getElementById("a").value
var b = document.getElementById("b").value
//TODO: pass the variables to the controller to perform insert query
}
Любые предложения или комментарии. TIA.
немного, я увидел в Интернете ссылку на то, что они его используют, но я изо всех сил пытаюсь преобразовать мою текущую логику в это.
для этого вы должны использовать метод jquery Ajax POST. например, эта структура ...
function submit(){
var a = document.getElementById("a").value
var b = document.getElementById("b").value
$.ajax({
url: '/ControllerName/Update/'
dataType: 'text',
type: 'post',
contentType: 'application/json',
data: {
'a':a,
'b':b
},
success: function( data, textStatus, jQxhr ){
alert('success')
console.info(data)
},
error: function( jqXhr, textStatus, errorThrown ){
console.info( errorThrown );
}
});
Пожалуйста, попробуйте это:
function submit(){
var a = document.getElementById("a").value;
var b = document.getElementById("b").value;
$.ajax({
url: '/ControllerName/Update(ActionResult)/'
type: 'post',
contentType: 'application/json',
data: {
'a':a,
'b':b
},
success: function(data){
alert('success');
},
error: function(xhr, textStatus, error){
alert(xhr.statusText);
alert(textStatus);
alert(error);
}
}
});
Нет конкретного сообщения об ошибке, но пока я возвращаюсь к "ошибке"
используйте это, чтобы поймать ошибку: error: function (xhr, textStatus, error) {alert (xhr.statusText); предупреждение (textStatus); предупреждение (ошибка); }
используйте try {} catch (exception ex) {throw ex;} в контроллере, чтобы вы могли получить исключение.
не вижу никаких ошибок, даже если я уже поставил попытку на своем контроллере, но всплывает предупреждение, говорящее, что не найдено
Вам нужно изменить имя таблицы, например, использовать наклон до и после имени таблицы MyTable
. мой sql обрабатывает таким образом. попробуйте это i.stack.imgur.com/aWYml.png
нужно указать одинарную кавычку до и после строки
Вы хотите использовать обратный вызов AJAX для вызова действия контроллера со стороны клиента, что должно быть настроено, как в примере ниже:
Функция JS
function SaveChanges() {
// input values
// the variable names intentionally changed to avoid confusion
var aval = $('#a').val();
var bval = $('#b').val();
var param = { a: aval, b: bval };
$.ajax({
type: 'POST',
url: '@Url.Action("Update", "ControllerName")',
data: param,
// other AJAX settings
success: function (result) {
alert("Successfully saved");
location.href = result; // redirect to index page
}
error: function (xhr, status, err) {
// error handling
}
});
}
Затем добавьте атрибут [HttpPost]
к действию контроллера и верните данные JSON, которые содержат URL-адрес для перенаправления, потому что RedirectToAction()
не работает должным образом с обратным вызовом AJAX:
Действие контроллера
[HttpPost]
public ActionResult Update(int a, string b)
{
string constr = ConfigurationManager.ConnectionStrings["ConString"].ConnectionString;
using (MySqlConnection con = new MySqlConnection(constr))
{
MySqlCommand cmd = new MySqlCommand("UPDATE MyTable SET a = @a WHERE b = @b ", con);
cmd.Parameters.AddWithValue("@a", a);
cmd.Parameters.AddWithValue("@b", b);
con.Open();
cmd.ExecuteNonQuery();
con.Close();
}
// create URL and return to view
string redirectUrl = Url.Action("Index", "ControllerName");
return Json(redirectUrl);
}
Обратите внимание, что это всего лишь простой пример, вы можете улучшить обработку исключений try...catch
и другие вещи, не упомянутые здесь.
Controller Code
public ActionResult Update(int a, string b)
{
string constr = ConfigurationManager.ConnectionStrings["ConString"].ConnectionString;
using (MySqlConnection con = new MySqlConnection(constr))
{
MySqlCommand cmd = new MySqlCommand("UPDATE MyTable SET a = @a WHERE b = @b ", con);
//cmd.CommandType = CommandType.StoredProcedure;
cmd.Parameters.AddWithValue("@a", a);
cmd.Parameters.AddWithValue("@b", b);
con.Open();
cmd.ExecuteNonQuery();
con.Close();
}
return RedirectToAction("Index");
}
.cshtml Code
function SaveChanges() {
var a = document.getElementById("a").value;
var b = document.getElementById("b").value;
$.ajax({
type: 'GET',
url: '@Url.Action("Update")',
data: {
'a': a,
'b': b
},
success: function(result) {
alert("Successfully saved");
},
error: function(xhr, status, err) {
// error handling code
}
});
}
Вам нужно вызвать функцию SaveChanges()
в событии нажатия кнопки отправки. На основе вашего ссылочного кода я должен сделать метод как ПОЛУЧАТЬ, если ваш метод на стороне контроллера - ПОЧТА, тогда в методе AJAX
вам нужно изменить тип метода ПОЛУЧАТЬ на ПОЧТА.
Вы знаете об Ajax? Кстати, нет смысла возвращать ответ Redirect из метода действия при вызове через Ajax.