Portal signin via Control Instance
This commit is contained in:
@@ -0,0 +1,426 @@
|
||||
using DocumentFormat.OpenXml.InkML;
|
||||
using DocumentFormat.OpenXml.Wordprocessing;
|
||||
using Microsoft.AspNetCore.Mvc;
|
||||
using Sarand.BusinessMgr.Net.Standard.Base.Bus.Control;
|
||||
using Sarand.BusinessMgr.Web.Control.Models;
|
||||
using Sarand.BusinessMgr.Web.Control.Models.Param;
|
||||
using Sarand.Net.Standard.Base.App;
|
||||
using Sarand.Net.Standard.Base.Bus;
|
||||
using Sarand.Net.Standard.Base.Core;
|
||||
using Sarand.Net.Standard.Base.Dbas;
|
||||
using Sarand.Net.Standard.Base.Utils;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using static Sarand.BusinessMgr.Net.Standard.Base.App.SbmSysParamCache;
|
||||
|
||||
namespace Sarand.BusinessMgr.Web.Control.Controllers.Param
|
||||
{
|
||||
//=======================================================================
|
||||
partial class ParamController
|
||||
{
|
||||
//-------------------------------------------------------------------
|
||||
// Definitions.
|
||||
|
||||
// Param data.
|
||||
private class ParamListData : AjaxResponse_Data.ItemData_Base
|
||||
{
|
||||
public String ItemCaption { get; set; }
|
||||
public String ParamType { get; set; }
|
||||
public String ParamCaption { get; set; }
|
||||
public String Name { get; set; }
|
||||
public String Context { get; set; }
|
||||
public String Value { get; set; }
|
||||
public bool? Password { get; set; }
|
||||
}
|
||||
private class ParamItemData : ParamListData
|
||||
{
|
||||
public String ItemType { get; set; }
|
||||
public String ItemId { get; set; }
|
||||
}
|
||||
private void PopulateParamResponseListData(SbmModel_Control model, ParamListData data, SbmcItemParam itemParam)
|
||||
{
|
||||
data.Id = SysId.ToString(itemParam.Id);
|
||||
data.ItemCaption = itemParam.ItemId.Type.ToString() + ": " + itemParam.ItemId.Id;
|
||||
data.Name = itemParam.Name;
|
||||
data.Context = itemParam.Context;
|
||||
if (itemParam.IsPasswordValue())
|
||||
data.Password = true;
|
||||
else
|
||||
data.Value = itemParam.Value;
|
||||
data.StatusCode = itemParam.StatusCode;
|
||||
data.StatusDesc = itemParam.StatusDesc;
|
||||
}
|
||||
private void PopulateParamResponseItemData(SbmModel_Control model, ParamItemData data, SbmcItemParam itemParam)
|
||||
{
|
||||
PopulateParamResponseListData(model, data, itemParam);
|
||||
data.ItemType = itemParam.ItemId.Type.ToString();
|
||||
data.ItemId = SysId.ToString(itemParam.ItemId.Id);
|
||||
data.ItemCaption = ControlItemMgr.GetItemCaption(itemParam.ItemId);
|
||||
data.Notes = itemParam.Notes;
|
||||
}
|
||||
|
||||
//-------------------------------------------------------------------
|
||||
// Get Filter Items ajax request.
|
||||
//-------------------------------------------------------------------
|
||||
private class AjaxResponse_FilterItemList : AjaxResponse_Data
|
||||
{
|
||||
// Construction.
|
||||
public AjaxResponse_FilterItemList(SbmModel_Control model) : base(model) { }
|
||||
// Items.
|
||||
public List<ItemIdName> Items { get; } = new List<ItemIdName>();
|
||||
}
|
||||
//-------------------------------------------------------------------
|
||||
[HttpPost]
|
||||
[Route("Param/Param/Ajax/GetFilterItems")]
|
||||
public IActionResult Ajax_GetParamFilterItemList(Model_Param model)
|
||||
{
|
||||
String messageTitle = Localiser["label.params"];
|
||||
AjaxResponse_FilterItemList responseData = new AjaxResponse_FilterItemList(model);
|
||||
|
||||
// Validate session and referrer.
|
||||
if (!ValidReferer) return Forbid();
|
||||
if (!ValidUserSession) return GetAjaxResult_InvalidSession(responseData);
|
||||
RefreshModel(model);
|
||||
|
||||
SbmcHierarchyItem.ItemType itemType = EnumUtil.ParseEnum(model.Filter.ItemType, SbmcHierarchyItem.ItemType.Unknown);
|
||||
if (itemType == SbmcHierarchyItem.ItemType.Unknown)
|
||||
{
|
||||
SaLogger.Warn($"{SysUtil.Fn} Item type not specified.");
|
||||
return Json(responseData);
|
||||
}
|
||||
|
||||
if (itemType == SbmcHierarchyItem.ItemType.Owner)
|
||||
{
|
||||
// Item filter.
|
||||
SbmcOwner.Params prmOwner = new SbmcOwner.Params();
|
||||
prmOwner.StatusCat = SbmcOwner.StatusCat.ActiveOnly;
|
||||
//model.Paging.ItemTotal = (ulong)ControlInstanceMgr.GetOwnerCount(prmOwner);
|
||||
//model.PopulatePagingTo(prmOwner.ResultsPaging);
|
||||
|
||||
// Item columns.
|
||||
ColumnDfn colId = ControlInstanceMgr.GetOwnerColumnDfn(SbmcOwner.Column.Id);
|
||||
ColumnDfn colName = ControlInstanceMgr.GetOwnerColumnDfn(SbmcOwner.Column.Name);
|
||||
List<ColumnDfn> columns = new List<ColumnDfn>() { colId, colName };
|
||||
|
||||
// Query items.
|
||||
using (DbResultSet resultSet = ControlInstanceMgr.ExecuteOwnerQuery(columns, prmOwner))
|
||||
{
|
||||
while (resultSet != null && resultSet.HasRows && resultSet.NextRecord())
|
||||
{
|
||||
NamedValue.Map values = resultSet.GetRecordValues();
|
||||
AjaxResponse_Data.ItemIdName itemParamData = new AjaxResponse_Data.ItemIdName()
|
||||
{
|
||||
Id = values.GetString(colId.DataName),
|
||||
Name = values.GetString(colName.DataName),
|
||||
};
|
||||
responseData.Items.Add(itemParamData);
|
||||
}
|
||||
}
|
||||
//if (model.Paging.IsPaged)
|
||||
// model.Paging.ItemCount = (ushort)responseData.Items.Count;
|
||||
|
||||
// Complete response.
|
||||
responseData.SetPaging(model);
|
||||
responseData.Success = true;
|
||||
}
|
||||
else if (itemType == SbmcHierarchyItem.ItemType.Repository)
|
||||
{
|
||||
// Item filter.
|
||||
SbmcRepository.Params prmRepository = new SbmcRepository.Params();
|
||||
prmRepository.StatusCat = SbmcRepository.StatusCat.ActiveOnly;
|
||||
//model.Paging.ItemTotal = (ulong)ControlInstanceMgr.GetRepositoryCount(prmRepository);
|
||||
//model.PopulatePagingTo(prmRepository.ResultsPaging);
|
||||
|
||||
// Item columns.
|
||||
ColumnDfn colId = ControlInstanceMgr.GetRepositoryColumnDfn(SbmcRepository.Column.Id);
|
||||
ColumnDfn colName = ControlInstanceMgr.GetRepositoryColumnDfn(SbmcRepository.Column.Context);
|
||||
List<ColumnDfn> columns = new List<ColumnDfn>() { colId, colName };
|
||||
|
||||
// Query items.
|
||||
using (DbResultSet resultSet = ControlInstanceMgr.ExecuteRepositoryQuery(columns, prmRepository))
|
||||
{
|
||||
while (resultSet != null && resultSet.HasRows && resultSet.NextRecord())
|
||||
{
|
||||
NamedValue.Map values = resultSet.GetRecordValues();
|
||||
AjaxResponse_Data.ItemIdName itemParamData = new AjaxResponse_Data.ItemIdName()
|
||||
{
|
||||
Id = values.GetString(colId.DataName),
|
||||
Name = values.GetString(colName.DataName),
|
||||
};
|
||||
responseData.Items.Add(itemParamData);
|
||||
}
|
||||
}
|
||||
//if (model.Paging.IsPaged)
|
||||
// model.Paging.ItemCount = (ushort)responseData.Items.Count;
|
||||
|
||||
// Complete response.
|
||||
responseData.SetPaging(model);
|
||||
responseData.Success = true;
|
||||
}
|
||||
return Json(responseData);
|
||||
}
|
||||
|
||||
//-------------------------------------------------------------------
|
||||
// Get Param List ajax request.
|
||||
//-------------------------------------------------------------------
|
||||
private class AjaxResponse_ParamList : AjaxResponse_Data
|
||||
{
|
||||
// Construction.
|
||||
public AjaxResponse_ParamList(SbmModel_Control model) : base(model) { }
|
||||
// Items.
|
||||
public List<ParamListData> Params { get; } = new List<ParamListData>();
|
||||
// Reference data.
|
||||
public List<CodeDesc> Statuses { get; } = new List<CodeDesc>();
|
||||
public List<CodeDesc> StatusesCreate { get; } = new List<CodeDesc>();
|
||||
public String StatusCodeDefault { get; set; }
|
||||
}
|
||||
//-------------------------------------------------------------------
|
||||
[HttpPost]
|
||||
[Route("Param/Param/Ajax/GetList")]
|
||||
[Route("Param/Param/Ajax/GetParams")]
|
||||
[Route("Param/Param/Ajax/GetParamList")]
|
||||
public IActionResult Ajax_GetParamList(Model_Param model)
|
||||
{
|
||||
String messageTitle = Localiser["label.params"];
|
||||
AjaxResponse_ParamList responseData = new AjaxResponse_ParamList(model);
|
||||
|
||||
// Validate session and referrer.
|
||||
if (!ValidReferer) return Forbid();
|
||||
if (!ValidUserSession) return GetAjaxResult_InvalidSession(responseData);
|
||||
RefreshModel(model);
|
||||
|
||||
// Reference data - statuses.
|
||||
foreach (SaStatus status in SbmcItemParam.ValidStatuses)
|
||||
{
|
||||
responseData.Statuses.Add(SacsSystem.GetStatusCode(status), Localiser.GetStatusCaption(status));
|
||||
if (status != SaStatus.Deleted)
|
||||
responseData.StatusesCreate.Add(SacsSystem.GetStatusCode(status), Localiser.GetStatusCaption(status));
|
||||
}
|
||||
responseData.StatusCodeDefault = SacsSystem.GetStatusCode(SbmcItemParam.DefaultStatus);
|
||||
|
||||
// Item filter.
|
||||
SbmcItemParam.Params prmParam = new SbmcItemParam.Params();
|
||||
ItemId itemId = new ItemId(StringUtil.ToShort(model.Filter.ItemType), StringUtil.ToSysId(model.Filter.ItemId));
|
||||
if (ItemId.IsValid(itemId))
|
||||
prmParam.ItemIdsIncluded.Add(itemId);
|
||||
prmParam.Search = model.Filter.Search;
|
||||
prmParam.Search = model.Filter.Search;
|
||||
prmParam.StatusCat = model.Filter.GetStatusCat();
|
||||
model.Paging.ItemTotal = (ulong)ControlItemMgr.GetItemParamCount(prmParam);
|
||||
model.PopulatePagingTo(prmParam.ResultsPaging);
|
||||
|
||||
// Item columns.
|
||||
ColumnDfn colId = ControlItemMgr.GetItemParamColumnDfn(SbmcItemParam.Column.Id);
|
||||
ColumnDfn colItemCaption = ControlItemMgr.GetItemParamColumnDfn(SbmcItemParam.Column.Item_Caption);
|
||||
ColumnDfn colContext = ControlItemMgr.GetItemParamColumnDfn(SbmcItemParam.Column.Context);
|
||||
ColumnDfn colName = ControlItemMgr.GetItemParamColumnDfn(SbmcItemParam.Column.Name);
|
||||
ColumnDfn colValue = ControlItemMgr.GetItemParamColumnDfn(SbmcItemParam.Column.Value);
|
||||
ColumnDfn colFlags = ControlItemMgr.GetItemParamColumnDfn(SbmcItemParam.Column.Status);
|
||||
ColumnDfn colStatus = ControlItemMgr.GetItemParamColumnDfn(SbmcItemParam.Column.Status);
|
||||
List<ColumnDfn> columns = new List<ColumnDfn>()
|
||||
{
|
||||
colId, colItemCaption, colContext, colName, colValue, colFlags, colStatus
|
||||
};
|
||||
|
||||
// Query items.
|
||||
using (DbResultSet resultSet = ControlItemMgr.ExecuteItemParamQuery(columns, prmParam))
|
||||
{
|
||||
while (resultSet != null && resultSet.HasRows && resultSet.NextRecord())
|
||||
{
|
||||
NamedValue.Map values = resultSet.GetRecordValues();
|
||||
String paramContext = values.GetString(colContext.DataName);
|
||||
String paramName = values.GetString(colName.DataName);
|
||||
ushort paramFlags = (ushort)values.GetLong(colFlags.DataName);
|
||||
ParamListData itemParamData = new ParamListData()
|
||||
{
|
||||
Id = values.GetString(colId.DataName),
|
||||
ItemCaption = ControlItemMgr.GetItemParamDataValue(colItemCaption, values).ToString(),
|
||||
Context = values.GetString(colContext.DataName),
|
||||
Name = values.GetString(colName.DataName),
|
||||
Value = ControlItemMgr.GetItemParamDataValue(colValue, values).ToString(),
|
||||
StatusCode = values.GetString(colStatus.DataName),
|
||||
StatusDesc = SacsSystem.GetStatusDescForCode(values.GetString(colStatus.DataName))
|
||||
};
|
||||
if (SbmcItemParam.IsPasswordValue(paramContext, paramName, paramFlags))
|
||||
itemParamData.Password = true;
|
||||
responseData.Params.Add(itemParamData);
|
||||
}
|
||||
}
|
||||
if (model.Paging.IsPaged)
|
||||
model.Paging.ItemCount = (ushort)responseData.Params.Count;
|
||||
|
||||
// Complete response.
|
||||
responseData.SetPaging(model);
|
||||
responseData.Success = true;
|
||||
return Json(responseData);
|
||||
}
|
||||
|
||||
//-------------------------------------------------------------------
|
||||
// Get Param ajax request.
|
||||
//-------------------------------------------------------------------
|
||||
private class AjaxResponse_Param : AjaxResponse_Data
|
||||
{
|
||||
// Construction.
|
||||
public AjaxResponse_Param(SbmModel_Control model) : base(model) { }
|
||||
// Param details.
|
||||
public ParamItemData Param { get; } = new ParamItemData();
|
||||
}
|
||||
//-------------------------------------------------------------------
|
||||
[HttpPost]
|
||||
[Route("Param/Param/Ajax/GetItem")]
|
||||
[Route("Param/Param/Ajax/GetParam")]
|
||||
public IActionResult Ajax_GetParam(Model_Param model)
|
||||
{
|
||||
String messageTitle = Localiser["label.param"];
|
||||
AjaxResponse_Param responseData = new AjaxResponse_Param(model);
|
||||
|
||||
// Validate session and referrer.
|
||||
if (!ValidReferer) return Forbid();
|
||||
if (!ValidUserSession) return GetAjaxResult_InvalidSession(responseData);
|
||||
RefreshModel(model);
|
||||
|
||||
// Record disposable items as they are created so all can be disposed when needed.
|
||||
using (DisposableCollection<SacsHierarchyItem> disposables = new DisposableCollection<SacsHierarchyItem>())
|
||||
{
|
||||
|
||||
// Identify item.
|
||||
SysId itemParamId = model.Param.Id.ToSysId();
|
||||
if (!SysId.IsValid(itemParamId))
|
||||
return Json(responseData.SetMessage(messageTitle, Localiser["msg.error.item.id.not.specified"]));
|
||||
|
||||
// Retrieve item.
|
||||
SbmcItemParam itemParam = ControlItemMgr.GetItemParamById(itemParamId);
|
||||
disposables.Add(itemParam);
|
||||
if (itemParam == null)
|
||||
{
|
||||
SaLogger.Warn($"{SysUtil.Fn} Failed to retrieve itemParam for Id: '" + itemParamId + "'");
|
||||
return Json(responseData.SetMessage(messageTitle, Localiser["msg.error.item.id.not.found"]));
|
||||
}
|
||||
|
||||
// Construct response.
|
||||
PopulateParamResponseItemData(model, responseData.Param, itemParam);
|
||||
responseData.Success = true;
|
||||
}
|
||||
return Json(responseData);
|
||||
}
|
||||
|
||||
//-------------------------------------------------------------------
|
||||
// Store Param ajax request.
|
||||
//-------------------------------------------------------------------
|
||||
[HttpPost]
|
||||
[Route("Param/Param/Ajax/StoreItem")]
|
||||
[Route("Param/Param/Ajax/StoreParam")]
|
||||
public IActionResult Ajax_StoreParam(Model_Param model)
|
||||
{
|
||||
String messageTitle = Localiser["label.param"];
|
||||
AjaxResponse_Param responseData = new AjaxResponse_Param(model);
|
||||
|
||||
// Validate session and referrer.
|
||||
if (!ValidReferer) return Forbid();
|
||||
if (!ValidUserSession) return GetAjaxResult_InvalidSession(responseData);
|
||||
RefreshModel(model);
|
||||
|
||||
// Validate item Id.
|
||||
SysId itemParamId = model.Param.Id.ToSysId();
|
||||
if (StringUtil.ToBool(model.Param.Exists) && !SysId.IsValid(itemParamId))
|
||||
{
|
||||
SaLogger.Warn($"{SysUtil.Fn} Id not supplied for existing Item Param.");
|
||||
return Json(responseData.SetMessage(messageTitle, Localiser["msg.error.system"]));
|
||||
}
|
||||
if (!StringUtil.ToBool(model.Param.Exists) && SysId.IsValid(itemParamId))
|
||||
{
|
||||
SaLogger.Warn($"{SysUtil.Fn} Id supplied for new Item Param.");
|
||||
return Json(responseData.SetMessage(messageTitle, Localiser["msg.error.system"]));
|
||||
}
|
||||
|
||||
// Validate item properties.
|
||||
model.ValidateParamData(responseData);
|
||||
if (responseData.HasControlErrors())
|
||||
return Json(responseData);
|
||||
|
||||
// Record disposable items as they are created so all can be disposed when needed.
|
||||
using (DisposableCollection<SacsHierarchyItem> disposables = new DisposableCollection<SacsHierarchyItem>())
|
||||
{
|
||||
|
||||
// Retrieve existing item.
|
||||
SbmcItemParam itemParam = ControlItemMgr.GetItemParamById(itemParamId);
|
||||
disposables.Add(itemParam);
|
||||
if (itemParam == null && SysId.IsValid(itemParamId))
|
||||
{
|
||||
SaLogger.Warn($"{SysUtil.Fn} Failed to retrieve Item Param for Id: '" + model.Param.Id + "'");
|
||||
return Json(responseData.SetMessage(messageTitle, Localiser["msg.error.item.id.not.found"]));
|
||||
}
|
||||
|
||||
// Contruct item id.
|
||||
ItemId itemId = new ItemId(StringUtil.ToShort(model.Param.ItemType), model.Param.ItemId.ToSysId());
|
||||
|
||||
if (itemParam != null && !itemParam.ItemId.Equals(itemId))
|
||||
{
|
||||
SaLogger.Warn($"{SysUtil.Fn} Inconsistent Item Id specified for Item Param. Expected - Type: {(SbmcHierarchyItem.ItemType)itemParam.ItemId.Type}, Id: {itemParam.ItemId.Id}. Submitted - Type: {(SbmcHierarchyItem.ItemType)itemId.Type}, Id: {itemId.Id} ");
|
||||
return Json(responseData.SetMessage(messageTitle, Localiser["msg.error.system"]));
|
||||
}
|
||||
|
||||
// Create new item if required.
|
||||
if (itemParam == null)
|
||||
{
|
||||
if (!ItemId.IsValid(itemId))
|
||||
{
|
||||
SaLogger.Warn($"{SysUtil.Fn} Item Id not specified for new Item Param.");
|
||||
return Json(responseData.SetMessage(messageTitle, Localiser["msg.error.system"]));
|
||||
}
|
||||
if (!SbmcItemParam.ValidItemTypes.Contains((SbmcHierarchyItem.ItemType)itemId.Type))
|
||||
{
|
||||
SaLogger.Warn($"{SysUtil.Fn} Invalid item type ({(SbmcHierarchyItem.ItemType)itemId.Type}) specified for new Item Param.");
|
||||
return Json(responseData.SetMessage(messageTitle, Localiser["msg.error.system"]));
|
||||
}
|
||||
if (StringUtil.IsBlank(ControlItemMgr.GetItemCaption(itemId)))
|
||||
{
|
||||
SaLogger.Warn($"{SysUtil.Fn} Invalid item (type: {(SbmcHierarchyItem.ItemType)itemId.Type}, id: {itemId.Id}) specified for new Item Param.");
|
||||
return Json(responseData.SetMessage(messageTitle, Localiser["msg.error.system"]));
|
||||
}
|
||||
|
||||
// Create parameter.
|
||||
itemParam = ControlItemMgr.CreateItemParam(itemId);
|
||||
}
|
||||
|
||||
// Populate item properties.
|
||||
if (model.Param.Context != null)
|
||||
itemParam.Context = model.Param.Context;
|
||||
if (model.Param.Name != null)
|
||||
itemParam.Name = model.Param.Name;
|
||||
if (model.Param.Value != null && StringUtil.ToBool(model.Param.ValueChanged))
|
||||
itemParam.Value = model.Param.Value;
|
||||
if (model.Param.Notes != null)
|
||||
itemParam.Notes = model.Param.Notes;
|
||||
if (model.Param.StatusCode != null)
|
||||
itemParam.Status = model.Param.GetStatus();
|
||||
|
||||
// Store item.
|
||||
if (!SysId.IsValid(itemParam.Id))
|
||||
{
|
||||
if (!ControlItemMgr.InsertItemParam(itemParam, DbUpdateInfo))
|
||||
{
|
||||
SaLogger.Warn($"{SysUtil.Fn} Failed to insert Item Param: " + ControlItemMgr.ErrorStateMessage);
|
||||
return Json(responseData.SetMessage(messageTitle, Localiser["msg.error.item.insert.failed"] + "\n\n" + ControlItemMgr.ErrorStateMessage));
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
if (!ControlItemMgr.UpdateItemParam(itemParam, DbUpdateInfo))
|
||||
{
|
||||
SaLogger.Warn($"{SysUtil.Fn} Failed to update Item Param [Id:" + SysId.ToString(itemParam.Id) + "]: " + ControlItemMgr.ErrorStateMessage);
|
||||
return Json(responseData.SetMessage(messageTitle, Localiser["msg.error.item.update.failed"] + "\n\n" + ControlItemMgr.ErrorStateMessage));
|
||||
}
|
||||
}
|
||||
|
||||
// Construct response.
|
||||
PopulateParamResponseItemData(model, responseData.Param, itemParam);
|
||||
responseData.Success = true;
|
||||
}
|
||||
return Json(responseData);
|
||||
}
|
||||
|
||||
//-------------------------------------------------------------------
|
||||
}
|
||||
//=======================================================================
|
||||
}
|
||||
@@ -0,0 +1,43 @@
|
||||
using Microsoft.AspNetCore.Mvc;
|
||||
using Microsoft.Extensions.Logging;
|
||||
using Sarand.BusinessMgr.Net.Core.Web.App;
|
||||
using Sarand.BusinessMgr.Web.Control.Models.Param;
|
||||
|
||||
namespace Sarand.BusinessMgr.Web.Control.Controllers.Param
|
||||
{
|
||||
//======================================================================
|
||||
public partial class ParamController : SbmController_Control
|
||||
{
|
||||
//-------------------------------------------------------------------
|
||||
// Data members.
|
||||
|
||||
//-------------------------------------------------------------------
|
||||
// Construction.
|
||||
public ParamController(SbmLocaliser localiser, ILogger<ParamController> logger) :
|
||||
base(localiser, logger)
|
||||
{
|
||||
}
|
||||
|
||||
//-------------------------------------------------------------------
|
||||
[Route("Param/Param")]
|
||||
public IActionResult Index()
|
||||
{
|
||||
if (!ValidUserSession)
|
||||
AutoLoginUser();
|
||||
|
||||
// Redirect to sign-in if not signed-in.
|
||||
if (!ValidUserSession)
|
||||
{
|
||||
ClearKeepLoggedInCookie();
|
||||
return RedirectToAction("", "Security");
|
||||
}
|
||||
|
||||
// Param page.
|
||||
Model_Param model = new Model_Param(Localiser);
|
||||
return View("Views/Param/Param/Index.cshtml", model);
|
||||
}
|
||||
|
||||
//-------------------------------------------------------------------
|
||||
}
|
||||
//======================================================================
|
||||
}
|
||||
Reference in New Issue
Block a user