Шаблон по умолчанию из VS2019 (dotnetcore 2.2), файл Startup.cs не нуждается в каких-либо изменениях.В контроллере я добавил пару вещей:
using Microsoft.Extensions.Configuration;
В своем классе контроллера я добавил:
private readonly IConfiguration configuration;
public ServicesController(IConfiguration config)
{
this.configuration = config;
}
Я изменил метод в классе модели, чтобы принять конфигурацию какпараметр.Вот как это выглядит при вызове из контроллера:
var calcOptions = MyData.CalcSelectDDSizeAndTilesPerBoxAll(this.configuration);
Полный код контроллера (для справки):
using Microsoft.AspNetCore.Mvc;
using Microsoft.Extensions.Configuration;
using TestAppWithService.Models;
namespace TestAppWithService.Controllers
{
public class ServicesController : Controller
{
private readonly IConfiguration configuration;
public ServicesController(IConfiguration config)
{
this.configuration = config;
}
public IActionResult Index()
{
return View();
}
// service returning json for dropdown options fill for tile calculator
public IActionResult GetCalcDDOptions()
{
var calcOptions = MyData.CalcSelectDDSizeAndTilesPerBoxAll(this.configuration); //note: pass the config to the model
return new ObjectResult(calcOptions);
}
}
}
в модели, которую я добавил:
using Microsoft.Extensions.Configuration;
затем к методу я добавил параметр информации о соединении:
public static List<DropDownOption> CalcSelectDDSizeAndTilesPerBoxAll(IConfiguration config)
и внутри метода получить строку соединения БД просто:
string dbconn = config.GetConnectionString("DefaultConnection");
Полный коддля модели:
using System;
using System.Collections.Generic;
using System.Data;
using System.Data.SqlClient;
using Microsoft.Extensions.Configuration;
namespace TestAppWithService.Models
{
// This is for custom database functions for services
public class MyData
{
static string LastErrorMsg = string.Empty;
public static List<DropDownOption> CalcSelectDDSizeAndTilesPerBoxAll(IConfiguration config)
{
Boolean HasErrors = false;
var retval = new List<DropDownOption>();
string dbconn = config.GetConnectionString("DefaultConnection");
using (SqlConnection conn = new SqlConnection(dbconn))
{
using (SqlCommand cmd = new SqlCommand("CalcSelectDDSizeAndTilesPerBoxAll", conn))
{
cmd.CommandType = CommandType.StoredProcedure;
cmd.CommandTimeout = 30;
try
{
conn.Open();
using (SqlDataReader r = cmd.ExecuteReader(CommandBehavior.CloseConnection))
{
if (r.HasRows)
{
while (r.Read())
{
DropDownOption ddo = new DropDownOption();
ddo.value = r["SizeAndNumInBox"].ToString();
ddo.text = r["Descr"].ToString();
retval.Add(ddo);
}
}
}
LastErrorMsg = string.Empty;
}
catch (Exception ex)
{
LastErrorMsg = ex.Message;
HasErrors = true;
}
}
if (!HasErrors)
{
return retval;
}
else
{
return new List<DropDownOption>(); //just an empty list returned
}
}
}
}
}
А для ударов вот представление с javascript (тестовой страницей) для использования службы:
@{
ViewData["Title"] = "Test";
}
<script type="text/javascript">
$(function () {
$("#btnFillDD").click(function () {
RetrieveCalcOptionsDD();
});
function RetrieveCalcOptionsDD() {
var ddl = $("#TilesInCartonBySize");
var oldEvent = ddl.attr("onchange");
ddl.attr("onchange", ""); //remove change event
$.ajax({
url: '../Services/GetCalcDDOptions',
dataType: 'json',
method: 'get',
success: function (retdata) {
ddl.empty();
$.each(retdata, function () {
ddl.append($("<option></option>").val(this['value']).html(this['text']));
});
},
error: function (err) {
console.log('Error (RetrieveCalcOptionsDD): ' + JSON.stringify(err, null, 2));
}
});
ddl.attr("onchange", oldEvent); //add change event back
};
});
</script>
<h1>Test</h1>
<p><button id="btnFillDD">Click Me</button></p>
<p>
<select id="TilesInCartonBySize" class="calcText" onchange="calculate(this.form);">
</select>
</p>
Обратите внимание, что эта "служба" простопредставление, которое возвращает json (так что вы можете использовать это для чего угодно).
Все хорошо.