ASP.NET MVC — вызов той же хранимой процедуры из другого представления / контроллера

#c# #asp.net-mvc-4

#c# #asp.net-mvc-4

Вопрос:

У меня есть 5 разных контроллеров / моделей / представлений. У меня есть кнопка в каждом из этих представлений, которая вызовет хранимую процедуру. В зависимости от контроллера хранимой процедуре передается другой параметр.

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

Вот фрагмент того, что я сделал — в каждом классе модели я использовал ADO.NET Модель данных объекта, чтобы получить хранимую процедуру в модели.

В каждом представлении у меня есть:

 <p style="margin-left: 2.5em">
    <br />
    <input type="button" style="height:40px; width: 160px;font-weight: bold;background-color:#00ffff; " value='@("Push to use stored procedure" )' onclick=" if (confirm ('Are you sure you want to do this?')){ window.location.href='@Url.Action("SPROCButton", "Controller1")' ;} " />
</p> 
  

В контроллере1:

 public ActionResult SPROCButton()
{
    try
    {
        db.uspCallTables("MyDB.temp.Table1");
        return RedirectToAction("Index");
    }
    catch (Exception e)
    {
        Console.WriteLine(e);
        throw;
    }
}
  

В других контроллерах единственная строка, которая изменяется, — это параметр. Необходимо ли иметь эту хранимую процедуру в каждой модели, а затем вызывать ее?

Спасибо вам, мистер

Ответ №1:

Есть несколько способов решить эту проблему. Я предлагаю создать базовый контроллер и добавить весь общий код.

Сила наследования не будет видна во всем своем великолепии в этом примере, но я думаю, что это очень поможет вам при написании общего кода.

 public class BaseController : Controller
{
     public void callSP(string theParameter){
        db.uspCallTables(theParameter);
     }
}
  

затем ваш Controller1 следующим образом:

 public class Controller1 : BaseController
{
   public ActionResult SPROCButton()
   {
      try
      {
        callSP("MyDB.temp.Table1");
        return RedirectToAction("Index");
      }
      catch (Exception e)
      {
         Console.WriteLine(e);
         throw;
      }
   }
}
  

Таким образом, вы сможете добавить весь общий код в родительский класс (BaseController.cs).
Я хочу уточнить, что я предполагаю, что «db» содержит контекст базы данных. Чтобы это сработало для вас, вы должны загрузить объект «db» нового класса BaseController таким же образом, как вы это делали в вашем Controller1. Я надеюсь, что это поможет вам. Дайте мне знать об этом! С уважением.