#c# #sql-server #asp.net-mvc #stored-procedures #asp.net-core-3.1
#c# #sql-сервер #asp.net-mvc #хранимые процедуры #asp.net-core-3.1
Вопрос:
Я пытаюсь использовать хранимые процедуры с ASP.NET Методы MVC, и я хочу добавить некоторые дополнительные параметры в метод редактирования, потому что эти параметры не могут быть добавлены в модель.
Вопрос в том, как я могу извлечь эти дополнительные данные из представления и передать их контроллеру?
Мой контроллер редактирования MVC
[HttpPost]
[ValidateAntiForgeryToken]
public async Task<IActionResult> Create([Bind("IdCervezas,NombreCerveza,NombreBotella,GradoAlc,CantContenidoMl,Puntuacion,Expectativas,ComentariosCerveza,EstadoCerveza")] SistemaWeb_Proyecto.Areas.Cervezas.Models.Cervezas cervezas
, Int32 idDistrib, Int32 idLocal, String codPertenencia, Decimal precio)
{
if (ModelState.IsValid)
{
SqlConnection connection = (SqlConnection)_context.Database.GetDbConnection();
SqlCommand cmd = connection.CreateCommand();
connection.Open();
cmd.CommandType = CommandType.StoredProcedure;
cmd.CommandText = "SP_Cervezas_InsertNewBeer";
cmd.Parameters.Add("@nombre_Cerveza", SqlDbType.VarChar, 100).Value = cervezas.NombreCerveza;
cmd.Parameters.Add("@nombre_Botella", SqlDbType.VarChar, 100).Value = cervezas.NombreBotella;
cmd.Parameters.Add("@ID_TipoCerv", SqlDbType.Int).Value = null;
cmd.Parameters.Add("@ID_Distrib", SqlDbType.Int).Value = idDistrib;
cmd.Parameters.Add("@ID_Local", SqlDbType.Int).Value = idLocal;
cmd.Parameters.Add("@codigo_Pertenencia", SqlDbType.VarChar, 10).Value = codPertenencia;
cmd.Parameters.Add("@cant_Contenido_ml", SqlDbType.Int).Value = cervezas.CantContenidoMl;
cmd.Parameters.Add("@grado_Alcohol", SqlDbType.Decimal).Value = cervezas.GradoAlc;
cmd.Parameters.Add("@precio", SqlDbType.Decimal).Value = precio;
cmd.Parameters.Add("@puntuacion", SqlDbType.Decimal).Value = cervezas.Puntuacion;
cmd.Parameters.Add("@expectativas", SqlDbType.VarChar, -1).Value = cervezas.Expectativas;
cmd.Parameters.Add("@comentariosCerveza", SqlDbType.VarChar, -1).Value = cervezas.ComentariosCerveza;
int resultQuery = cmd.ExecuteNonQuery();
if (resultQuery == 1)
{
//MessageBox.Show("Success :D");
}
else
{
//MessageBox.Show("Failed >:(");
}
_context.Add(cervezas);
await _context.SaveChangesAsync();
return RedirectToAction(nameof(Index));
}
return View(cervezas);
}
Комментарии:
1. Примечание: вы не должны использовать
sp_
префикс для своих хранимых процедур. Microsoft зарезервировала этот префикс для собственного использования (см. Именование хранимых процедур ) , и вы рискуете столкнуться с конфликтом имен когда-нибудь в будущем. Это также плохо сказывается на производительности вашей хранимой процедуры . Лучше всего просто избегатьsp_
и использовать что-то другое в качестве префикса — или вообще без префикса!2. Вы пробовали создать CervezasViewModel POCO со всеми свойствами из вашей модели домена Cervezas, плюс пользовательские свойства для параметров вашей хранимой процедуры и инструктировать ваш контроллер использовать это?
3. @marc_s Спасибо 4 руководителю: D, итак … могу ли я использовать вместо
sp_
префиксаMy_SP_
префикс? Если нет, то я попытался хотя бы изменить его, потому что в моей последней работе мы использовали имена SP с этим префиксом.4. @AlwaysLearning ViewModel POCO? Ну, это что-то новенькое, не слышал об этом так. И я не знаю, лучший ли это путь, потому что мне пришлось бы создать специальную ViewModel для каждого SP, чтобы работать, но поправьте меня, если я ошибаюсь. Спасибо за ваш ответ
5. В MVC нередко есть модели домена, модели просмотра и модели редактирования. Код, сгенерированный ASP.NET MVC и ASP.NET Core MVC просто объединяет их в один слой по умолчанию. Однако, если у вас есть пользовательские хранимые процедуры с дополнительными параметрами для каждого объекта, возможно, вам нужно использовать другие инструменты.