i'm facing problem to access value from database of lstpresentEmp and lstAbsentEmp , on Employee controller - asp.net-mvc

namespace BarrownzAdmin.Controllers
{
public class HRController : BaseController
{
EncryptionManager em = new EncryptionManager();
static string empstaticid = "";
static string rescanstaticid = "";
// GET: HR
public ActionResult Index()
{
if (Session["HRuser"] != null)
{
ViewBag.ControllerVariable = 2;
CandidateActivityIndex();
GetScheduleIV();
GetWeekIVSchedule();
GetTodaysResume();
GetWeekResume();
GetEmpUnassignTask();
BindPresentEmp();
BindAbsentEmp();
return View();
}
else
{
return RedirectToAction("Login", "Access");
}
}

[NonAction]
public void BindPresentEmp()
{
Employee em = new Employee();
MasterBusinesslayer hrLayer = new MasterBusinesslayer();
List<Employee> _lstPresentEmp = hrLayer.GetFiveEmpLeave(em.BindPresentEmpl(), em);
ViewBag.PresentEmp = _lstPresentEmp;
}
[NonAction]
public void BindAbsentEmp()
{
Employee em = new Employee();
MasterBusinesslayer hrLayer = new MasterBusinesslayer();
List<Employee> _lstAbsentEmp = hrLayer.GetFiveEmpLeave(em.BindAbsentEmpl(), em);
ViewBag.AbsentEmp = _lstAbsentEmp;
}

Related

public ActionResult Index5() { return RedirectToAction("Index","Student", new { name = "ATHUL",address="TVM" }); }

public ActionResult Index(string name, string address)
{
Student obj = new Student()
{
name = "VAZEEM",
address="CALCUT"
};
return View(obj);
}
public ActionResult Index5()
{
return RedirectToAction("Index","Student", new { name = "ATHUL",address="TVM" });
}
please corrept the code
change index detail to index5 detail

How do I programmatically add records to an Umbraco v8 form?

I'm looking to add records to an Umbraco v8 form. I know I need the form guid. Is this how I'd do it? Something like this?
public void PostFormData()
{
Guid FormGuid = new Guid("8494a8f0-94da-490e-bd61-7e658c226142");
var form = _formService.Get(FormGuid);
//place for field data into fieldDic
var fieldDic = new Dictionary<Guid, RecordField>();
var firstName = form.AllFields.First(f => f.Alias == "firstName");
var firstNameRecord = new RecordField(firstName);
firstNameRecord.Values = new List<object>() { "Mad Max" };
fieldDic.Add(firstName.Id, firstNameRecord);
var record = new Record()
{
Created = DateTime.Now,
Form = form.Id,
RecordFields = fieldDic,
State = FormState.Submitted,
};
record.RecordData = record.GenerateRecordDataAsJson();
_recordStorage.InsertRecord(record, form);
}
Here's how I do it. Note, I'm hard-coding the Record.UmbracoPageId to -1 while you might want to actually pass in the correct page ID.
using Newtonsoft.Json;
using Newtonsoft.Json.Linq;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text.RegularExpressions;
using Umbraco.Core;
using Umbraco.Core.Composing;
using Umbraco.Core.Logging;
using Umbraco.Forms.Core.Data.Storage;
using Umbraco.Forms.Core.Models;
using Umbraco.Forms.Core.Persistence.Dtos;
using Umbraco.Forms.Core.Services;
namespace myProject.Services
{
public class FormServiceComposer : IUserComposer
{
public void Compose(Composition composition)
{
composition.Register<IFormService, FormService>(Lifetime.Request);
}
}
public interface IFormService
{
void InsertFormData(Guid formGuid, object formModel, string ipAddress);
}
public class FormService : IFormService
{
private readonly ILogger _logger;
private readonly Umbraco.Forms.Core.Services.IFormService _formService;
private readonly IRecordStorage _recordStorage;
private readonly IRecordFieldStorage _recordFieldStorage;
private readonly IWorkflowService _workflowService;
public FormService(ILogger logger, Umbraco.Forms.Core.Services.IFormService formService, IRecordStorage recordStorage, IRecordFieldStorage recordFieldStorage, IWorkflowService workflowService)
{
_logger = logger;
_formService = formService;
_recordStorage = recordStorage;
_recordFieldStorage = recordFieldStorage;
_workflowService = workflowService;
}
#region IFormService
public void InsertFormData(Guid formGuid, object formModel, string ipAddress)
{
try
{
Form form = _formService.GetForm(formGuid);
Record record = new Record();
foreach (Field field in form.AllFields)
{
string caption = CleanCaption(field.Caption);
if (formModel.GetType().GetProperty(caption) == null) continue;
var propertyValue = formModel.GetType().GetProperty(caption).GetValue(formModel, null);
if (propertyValue != null)
{
List<object> values = ExtractValues(propertyValue);
RecordField recordField = new RecordField
{
Alias = field.Alias,
FieldId = field.Id,
Field = field,
Key = Guid.NewGuid(),
Record = record.Id,
Values = values
};
_recordFieldStorage.InsertRecordField(recordField);
record.RecordFields.Add(recordField.Key, recordField);
}
}
record.Form = formGuid;
record.IP = ipAddress;
record.UmbracoPageId = -1;
record.State = Umbraco.Forms.Core.Enums.FormState.Approved;
record.RecordData = record.GenerateRecordDataAsJson();
_recordStorage.InsertRecord(record, form);
_recordStorage.DisposeIfDisposable();
}
catch (Exception ex)
{
_logger.Error<FormService>(ex, "Failed inserting Umbraco Forms data for {formGuid}");
}
}
#endregion IFormService
#region Private
private string CleanCaption(string caption)
{
Regex rgx = new Regex("[^a-zA-Z0-9 -]");
return rgx.Replace(caption.Trim().Replace(" ", ""), "");
}
private List<object> ExtractValues(object propertyValue)
{
List<object> result = new List<object>();
if (propertyValue is string == false && propertyValue.GetType().GetGenericTypeDefinition() == typeof(List<>))
{
IEnumerable<object> _propertyValue = (IEnumerable<object>)propertyValue;
if (_propertyValue.Any())
{
if (_propertyValue.First().GetType().GetProperties().Count() > 1)
{
JArray _properties = JArray.Parse(JsonConvert.SerializeObject(propertyValue));
foreach (JToken item in _properties)
{
string _value = string.Empty;
foreach (var _property in _propertyValue.First().GetType().GetProperties())
{
string _key = _property.Name;
_value = _value + (_value == "" ? "" : " - ") + item[_key].ToString();
}
result.Add(_value);
}
}
else
{
string _key = _propertyValue.First().GetType().GetProperties().First().Name;
JArray _properties = JArray.Parse(JsonConvert.SerializeObject(propertyValue));
foreach (JToken item in _properties)
{
result.Add(item[_key].ToString());
}
}
}
}
else
{
result.Add(propertyValue);
}
return result;
}
#endregion Private
}
}

Mock Session is not working in Unit test of Controller action

I created a sample ASP.NET MVC application.The default application provided by the Visual Studio.
I created folder named Utilities and place the below 4 classes
Connection
ConnectionRepository
SecurityManager
SessionManger
Below are the code of the above classes
public class Connection
{
public string ConnectionString { get; set; }
public Connection(string connectionStr)
{
this.ConnectionString = connectionStr;
}
public User GetUser(string userId)
{
return new User() { UserId="User1",Email="User1#company.com" };
}
}
******
using LegacyHttpContext = System.Web.HttpContext;
namespace SampleNunitApplication.Utilities
{
public class ConnectionRepository
{
public Connection ConnectionData
{
get
{
Connection con;
if(Convert.ToBoolean(LegacyHttpContext.Current.Application["isSourceOffline"].ToString()))
{
con = this.RefreshConfigDataFromAppServer();
}
else
{
con = this.RefreshConfigDataFromDB();
}
return con;
}
}
public Connection RefreshConfigDataFromDB()
{
Connection dbConnection = new Utilities.Connection("DataFromSqlServer");
LegacyHttpContext.Current.Application["_connData"] = dbConnection;
return dbConnection;
}
public Connection RefreshConfigDataFromAppServer()
{
Connection appConnection = new Utilities.Connection("DataFromAppServer");
LegacyHttpContext.Current.Application["_connData"] = appConnection;
return appConnection;
}
}
}
*******
using LegacyHttpContext = System.Web.HttpContext;
namespace SampleNunitApplication.Utilities
{
public class SecurityManager
{
public static SecurityManager GetFromCache()
{
if(LegacyHttpContext.Current.Application["SecurityManager"]==null)
{
SecurityManager securityManager = new SecurityManager();
LegacyHttpContext.Current.Application["SecurityManager"] = securityManager;
return securityManager;
}
else
{
return LegacyHttpContext.Current.Application["SecurityManager"] as SecurityManager;
}
}
public User GetAuthenticatedUser(string userId)
{
ConnectionRepository connRepository = new ConnectionRepository();
Connection con = connRepository.ConnectionData;
return con.GetUser(userId);
}
}
}
*****
public class SessionManager
{
public string EmployeeId { get; set; }
public string Email { get; set; }
public static void SaveToSessionState(HttpSessionStateBase state,SessionManager sessionManager)
{
state["SessionManager"] = sessionManager;
}
public static SessionManager LoadFromSessionState(HttpSessionStateBase state)
{
if (state["SessionManager"] ==null)
{
return new SessionManager();
}
return state["SessionManager"] as SessionManager;
}
}
****In the HomeController.cs***
public ActionResult Index()
{
SessionManager authenticateUser = SessionManager.LoadFromSessionState(this.HttpContext.Session);
ValidationModel.Validate(authenticateUser.EmployeeId, this.HttpContext);
SessionManager.LoadFromSessionState(this.HttpContext.Session);
return View();
}
*******************In the Global.asax***
protected void Session_Start()
{
HttpSessionStateWrapper sessionWrapper = new HttpSessionStateWrapper(System.Web.HttpContext.Current.Session);
System.Web.HttpContext.Current.Application["isSourceOffline"] = false;
SessionManager authenticateUser = SessionManager.LoadFromSessionState(sessionWrapper);
User user = SecurityManager.GetFromCache().GetAuthenticatedUser("User1");
authenticateUser.EmployeeId = user.UserId;
authenticateUser.Email = user.Email;
SessionManager.SaveToSessionState(sessionWrapper, authenticateUser);
}
******
I created a class library project and created below mock code
[TestClass] public class UnitTest1
{
[TestMethod]
public void TestMethod1()
{
var application = new Mock<HttpApplicationStateBase>();
SecurityManager securityManager = new SecurityManager();
application.SetupGet(s => s["isSourceOffline"]).Returns(true);
application.SetupGet(s => s["SecurityManager"]).Returns(securityManager);
var context = new Mock<HttpContextBase>();
var request = new Mock<HttpRequestBase>();
var response = new Mock<HttpResponseBase>();
var session = new Mock<HttpSessionStateBase>();
var server = new Mock<HttpServerUtilityBase>();
session.Setup(s => s.SessionID).Returns(Guid.NewGuid().ToString());
context.Setup(c => c.Request).Returns(request.Object);
context.Setup(c => c.Response).Returns(response.Object);
context.Setup(c => c.Session).Returns(session.Object);
context.Setup(c => c.Application).Returns(application.Object);
context.Setup(c => c.Server).Returns(server.Object);
SessionManager authenticatedUser = new SessionManager();
authenticatedUser.EmployeeId = "TestUser";
authenticatedUser.Email = "Test#testmail.com";
SessionManager.SaveToSessionState(context.Object.Session, authenticatedUser);
HomeController objController = new HomeController();
objController.ControllerContext = new System.Web.Mvc.ControllerContext(context.Object, new RouteData(), objController);
objController.Index();
}
}
If I run the ASP.NET MVC application it works good. But when i run the test case it hits the Index method of the HomeController but SessionManager authenticateUser = SessionManager.LoadFromSessionState(this.HttpContext.Session); is not populating from the session. Properties in the authenticateUser are null.
Seems like mock session is not working please help

Call WCF Restful POST Method in MVC 5

I have to create simple WCF web service with GET and POST. See bellow source code
public interface ISample
{
[OperationContract]
[WebGet(UriTemplate = "/GetDEPT", RequestFormat = WebMessageFormat.Json,ResponseFormat = WebMessageFormat.Json)]
Task<IEnumerable<DEPT>> GetDEPT();
[OperationContract]
[WebInvoke(UriTemplate = "UpdateDEPT?Id={Id}&StatusId={StatusId}", Method = "POST", RequestFormat = WebMessageFormat.Json, ResponseFormat = WebMessageFormat.Json)]
Task<bool> UpdateDEPT(List<DEPT> DEPT, string Id, string StatusId);
}
ISample interface Implementation : Sample
public class Sample: ISample
{
public async Task<IEnumerable<DEPTt>> GetDEPT()
{
return await DEPTBO.GetDEPT();
}
public async Task<bool> UpdateDEPT(List<DEPTt> DEPT, string Id, string StatusId)
{
return await DEPTBO.UpdateDEPTAsync(Id, DEPT, StatusId);
}
}
How to call this WCF Restful service in MVC 5?
Please help me Service integration in MVC Application
Now i found the solution for my question.
I have create class for proxy
namespace WCF.WCFService
{
public static class WebService<T> where T : class
{
public static string appSettings = ConfigurationManager.AppSettings["ServiceURL"];
public static IEnumerable<T> GetDataFromService(string Method, string param = "")
{
var client = new WebClient();
var data = client.DownloadData(appSettings + Method + param);
var stream = new System.IO.MemoryStream(data);
var obj = new DataContractJsonSerializer(typeof(IEnumerable<T>));
var result = obj.ReadObject(stream);
IEnumerable<T> Ts = (IEnumerable<T>)result;
return Ts;
}
}
public static class WebServiceUpdate
{
public static string appSettings = ConfigurationManager.AppSettings["ServiceURL"];
public static bool GetDataFromService_Update(string Method, List<CNHDataModel.CustomEntities.Port> portData, string param = "")
{
bool _res = false;
DataContractJsonSerializer serializer = new DataContractJsonSerializer(typeof(List<CNHDataModel.CustomEntities.Port>));
MemoryStream mem = new MemoryStream();
serializer.WriteObject(mem, portData);
string data =
Encoding.UTF8.GetString(mem.ToArray(), 0, (int)mem.Length);
WebClient webClient = new WebClient();
webClient.Headers["Content-type"] = "application/json";
webClient.Encoding = Encoding.UTF8;
webClient.UploadString(appSettings + Method + param, "POST", data);
_res = true;
bool Ts = (bool)_res;
return Ts;
}
}
}
Bellow, call the service proxy from controller
public class DEPTController : Controller
{
[ActionName("DEPTView")]
public ActionResult DEPTViewAsync()
{
try
{
IEnumerable<DEPT> DEPT = CNHService.WebService<DEPT>.GetDataFromService("GetDEPT");
if (port == null)
{
return HttpNotFound();
}
IEnumerable<Status> Status = CNHService.WebService<Status>.GetDataFromService("GetStatusAsync");
if (port == null || Status == null)
{
return HttpNotFound();
}
}
catch (Exception ex)
{
}
return View();
}
[HttpPost]
[ActionName("DEPTView")]
public ActionResult DEPTViewAsync([Bind(Include = "id,Statusid")] DEPT DEPTMENT)
{
try
{
List<DEPT> objDEPT = Session["DEPTItems"] as List<DEPT>;
List<DEPTStatus> objStatus = Session["DEPTIStatus"] as List<PortStatus>;
ViewBag.DEPTList = new SelectList(objDEPTt, "id", "Name");
ViewBag.DEPTStatusList = new SelectList(objStatus, "id", "Name");
if (ModelState.IsValid)
{
WebServiceUpdate.GetDataFromService_Update("UpdateDEPT", objDEPT, "?Id=" + DEPTMENT.Id + "&StatusId=" + DEPTMENT.Statusid);
setting.Message = true;
}
else
{
return View(setting);
}
}
catch (Exception ex)
{
}
return View(setting);
}
}
I hope this code help to WCF Restful service integration in MVC 5

The parameters dictionary contains a null entry for parameter 'id' of non-nullable type 'Int32' for method 'Edit(Int32)'

I am performing CRUD operation using linq to sql. But while clicking on Edit, Details or delete it gives me error i.e. "The parameters dictionary contains a null entry for parameter 'id' of non-nullable type 'System.Int32' for method 'System.Web.Mvc.ActionResult Edit(Int32)' in 'CRUD_using_LinQ_to_SQL_in_MVC.Controllers.OTDController'. An optional parameter must be a reference type, a nullable type, or be declared as an optional parameter."
I checked the solution and found that, while running application url didn't get ID parameter. But i dont understand what should i change in my code.. Can you please help me...
My Controller Code:
using System;
namespace CRUD_using_LinQ_to_SQL_in_MVC.Controllers
{
public class OTDController : Controller
{
private IOTddataRepository repository;
public OTDController()
: this(new OtdDataRepository())
{
}
public OTDController(IOTddataRepository _repository)
{
repository = _repository;
}
//-----------------------Index--------------------------
public ActionResult Index()
{
var otddata = repository.Getallotddata();
return View(otddata);
}
//-----------------------Details--------------------------
public ActionResult Details(int id)
{
OtdModelClass otdmodel = repository.Getotddatabysrno(id);
return View(otdmodel);
}
//-----------------------Create--------------------------
public ActionResult Create()
{
return View(new OtdModelClass());
}
[HttpPost]
public ActionResult Create(OtdModelClass otdmodel)
{
try
{
if (ModelState.IsValid)
{
repository.Insertotddata(otdmodel);
return RedirectToAction("Index");
}
}
catch (DataException)
{
ModelState.AddModelError("", "Problem in Data Saving");
}
return View(otdmodel);
}
//-----------------------EDIT--------------------------
public ActionResult Edit(int id)
{
OtdModelClass otdmodel = repository.Getotddatabysrno(id);
return View(otdmodel);
}
[HttpPost]
public ActionResult Edit(OtdModelClass otdclass)
{
try
{
if (ModelState.IsValid)
{
repository.Updateotddata(otdclass);
return RedirectToAction("Index");
}
}
catch (DataException)
{
ModelState.AddModelError("", "Problem in editing and Updating data");
}
return View(otdclass);
}
//-----------------------Delete--------------------------
public ActionResult Delete(int id, bool? savechangeserror)
{
if (savechangeserror.GetValueOrDefault())
{
ViewBag.ErrorMessage = "Problem in Deleting";
}
OtdModelClass otdmodel = repository.Getotddatabysrno(id);
return View(otdmodel);
}
[HttpPost, ActionName("Delete")]
public ActionResult DeleteConfirmed(int id)
{
try
{
OtdModelClass otdmodel = repository.Getotddatabysrno(id);
repository.Deleteotddata(id);
}
catch (DataException)
{
return RedirectToAction("Delete", new System.Web.Routing.RouteValueDictionary {
{"id",id},
{"SaveChangesError",true}});
}
return RedirectToAction("Index");
}
}
}
My OTD class Code:
public class OtdDataRepository : IOTddataRepository
{
private MVCLoginMasterLogDataClassesDataContext otdcontextobj;
public OtdDataRepository()
{
otdcontextobj = new MVCLoginMasterLogDataClassesDataContext();
}
public IEnumerable<OtdModelClass> Getallotddata()
{
IList<OtdModelClass> otddatalist = new List<OtdModelClass>();
var myselectallquery = from otduser in otdcontextobj.tbl_MVC_Login_Master_Logs select otduser;
var otd = myselectallquery.ToList();
foreach (var otddata in otd)
{
otddatalist.Add(new OtdModelClass()
{
Srno=Convert.ToInt32(otddata.Srno),
MemberCode = otddata.MemberCode,
LoginID = otddata.LoginID,
OTDPassword = otddata.OTDPassword,
BBSID = otddata.BBSID,
IPAddress = otddata.IPAddress,
ServerType = otddata.ServerType,
OTDStatus = otddata.OTDStatus,
RemoteIP = otddata.RemoteIP,
RemotePort = otddata.RemotePort,
AllowDownload = otddata.AllowDownload,
OTDTimeStamp = otddata.OTDTimeStamp,
MemberType = otddata.MemberType,
EQ = otddata.EQ,
EQD = otddata.EQD,
BFX = otddata.BFX,
SLB = otddata.SLB,
Others = otddata.Others
});
}
return otddatalist;
}
public OtdModelClass Getotddatabysrno(int id)
{
var getotddataquery = from otduser in otdcontextobj.tbl_MVC_Login_Master_Logs
where otduser.Srno == id
select otduser;
var otddata = getotddataquery.FirstOrDefault();
var otdmodel = new OtdModelClass()
{
Srno = Convert.ToInt32(otddata.Srno),
MemberCode = otddata.MemberCode,
LoginID = otddata.LoginID,
OTDPassword = otddata.OTDPassword,
BBSID = otddata.BBSID,
IPAddress = otddata.IPAddress,
ServerType = otddata.ServerType,
OTDStatus = otddata.OTDStatus,
RemoteIP = otddata.RemoteIP,
RemotePort = otddata.RemotePort,
AllowDownload = otddata.AllowDownload,
OTDTimeStamp = otddata.OTDTimeStamp,
MemberType = otddata.MemberType,
EQ = otddata.EQ,
EQD = otddata.EQD,
BFX = otddata.BFX,
SLB = otddata.SLB,
Others = otddata.Others
};
return otdmodel;
}
public void Insertotddata(OtdModelClass otdmodel_obj)
{
var empdata = new tbl_MVC_Login_Master_Log()
{
Srno = Convert.ToInt32(otdmodel_obj.Srno),
MemberCode = otdmodel_obj.MemberCode,
LoginID = otdmodel_obj.LoginID,
OTDPassword = otdmodel_obj.OTDPassword,
BBSID = otdmodel_obj.BBSID,
IPAddress = otdmodel_obj.IPAddress,
ServerType = otdmodel_obj.ServerType,
OTDStatus = otdmodel_obj.OTDStatus,
RemoteIP = otdmodel_obj.RemoteIP,
RemotePort = otdmodel_obj.RemotePort,
AllowDownload = otdmodel_obj.AllowDownload,
OTDTimeStamp = otdmodel_obj.OTDTimeStamp,
MemberType = otdmodel_obj.MemberType,
EQ = otdmodel_obj.EQ,
EQD = otdmodel_obj.EQD,
BFX = otdmodel_obj.BFX,
SLB = otdmodel_obj.SLB,
Others = otdmodel_obj.Others
};
otdcontextobj.tbl_MVC_Login_Master_Logs.InsertOnSubmit(empdata);
otdcontextobj.SubmitChanges();
}
public void Deleteotddata(int id)
{
tbl_MVC_Login_Master_Log otd_deletelog = otdcontextobj.tbl_MVC_Login_Master_Logs.Where(otduser => otduser.Srno == id).SingleOrDefault();
otdcontextobj.tbl_MVC_Login_Master_Logs.DeleteOnSubmit(otd_deletelog);
otdcontextobj.SubmitChanges();
}
public void Updateotddata(OtdModelClass otdmodel_obj)
{
tbl_MVC_Login_Master_Log otd_updatelog = otdcontextobj.tbl_MVC_Login_Master_Logs.Where(otduser=>otduser.Srno==otdmodel_obj.Srno).SingleOrDefault();
otd_updatelog.Srno = otdmodel_obj.Srno;
otd_updatelog.MemberCode = otdmodel_obj.MemberCode;
otd_updatelog.LoginID = otdmodel_obj.LoginID;
otd_updatelog.OTDPassword = otdmodel_obj.OTDPassword;
otd_updatelog.BBSID = otdmodel_obj.BBSID;
otd_updatelog.IPAddress = otdmodel_obj.IPAddress;
otd_updatelog.ServerType = otdmodel_obj.ServerType;
otd_updatelog.OTDStatus = otdmodel_obj.OTDStatus;
otd_updatelog.RemoteIP = otdmodel_obj.RemoteIP;
otd_updatelog.RemotePort = otdmodel_obj.RemotePort;
otd_updatelog.AllowDownload = otdmodel_obj.AllowDownload;
otd_updatelog.OTDTimeStamp = otdmodel_obj.OTDTimeStamp;
otd_updatelog.MemberType = otdmodel_obj.MemberType;
otd_updatelog.EQ = otdmodel_obj.EQ;
otd_updatelog.EQD = otdmodel_obj.EQD;
otd_updatelog.BFX = otdmodel_obj.BFX;
otd_updatelog.SLB = otdmodel_obj.SLB;
otd_updatelog.Others = otdmodel_obj.Others;
otdcontextobj.SubmitChanges();
}
}
Can you please help me...
The framework is telling you that the link you are clicking on to call the Edit and Delete action methods is not providing an int parameter named id which the action method is expecting to find somewhere in the submitted data. This is usually provided either in the URL, query string or submitted variables.
If that is not enough for you to spot the problem, post your view code specially the section related to the links.

Resources