Вечером все, я надеялся, что кто-то может помочь мне вместе с проектом, над которым я работаю.
Непосредственно перед тем, как я действительно начну, я просто хочу прояснить это, я никогда ничего не делал как прежде, чем поболтать дома, я не являюсь C# разработчиком или администратором базы данных. Поэтому прошу прощения за любые перерывы в передовой практике, это всего 4 недели обучения, и я стучу головой по столу, пытаясь следовать тихой запутанной топи c.
Так что я (каким-то образом) закончил до того, как мне было поручено создать несколько веб-сайтов, и в попытке сделать это проще для себя, я попытался создать «шаблонную» систему, в которой я использую несколько частичных страниц / частей на странице макета для управления веб-сайтом с помощью данных. .
Я создал приведенную ниже структуру базы данных, пытаясь продумать все, что мне понадобится, например, включение и выключение деталей и создание элемента управления, создающего структуру меню.
Диаграмма моделей
на обратной стороне того, что я создал нижеуказанный класс, который создает все различные модели представлений, которые я хочу передать каждой частичной части в моем макете (есть несколько зависимых на сайте, следовательно, части вместо одного гигантского макета).
public class PageDetails
{
public static async Task<DataPageDetailsVM> Get(int companyID, ControllerContext controllerContext)
{
using (var dimensionContext = new DimensionContext())
{
var cDNAddress = await CDNAddress.Get();
var aPIAddress = await APIAddress.Get();
var routeDetails = new RouteDetails(controllerContext);
var canonicalPath = CanonicalPath.Get(routeDetails);
var pageDetailsVM = await dimensionContext.PageDetail
.Where(pde => pde.PageAction.PageController.PageArea.Company.CompanyID == companyID
&& (pde.PageAction.PageController.PageArea.Area == (routeDetails.Area ?? "Home")
&& !pde.PageAction.PageController.PageArea.Excluded)
&& (pde.PageAction.PageController.Controller == routeDetails.Controller
&& !pde.PageAction.PageController.Excluded)
&& (pde.PageAction.Action == routeDetails.Action
&& !pde.PageAction.Excluded))
.Select(pde => new DataPageDetailsVM
{
PageActionID = pde.PageActionID,
CDNAddress = cDNAddress,
APIAddress = aPIAddress,
Title = pde.Title,
FormattedTitle = pde.FormattedTitle,
TagLine = pde.TagLine,
StrapLine = pde.StrapLine,
Latitude = pde.PageAction.PageController.PageArea.Company.CompanyAddress
.Select(sca => sca.Latitude)
.FirstOrDefault(),
Longitude = pde.PageAction.PageController.PageArea.Company.CompanyAddress
.Select(sca => sca.Longitude)
.FirstOrDefault(),
DataRouteVM = new DataRouteVM
{
PrimaryDomain = pde.PageAction.PageController.PageArea.Company.CompanySettings
.Select(scs => scs.PrimaryDomain)
.FirstOrDefault(),
Area = (routeDetails.Area ?? "Home"),
Controller = routeDetails.Controller,
Action = routeDetails.Action
},
DataCompanyVM = new DataCompanyVM
{
CompanyID = companyID,
ShortName = pde.PageAction.PageController.PageArea.Company.ShortName,
LongName = pde.PageAction.PageController.PageArea.Company.LongName
},
PartHeaderVM = new PartHeaderVM
{
ShortName = pde.PageAction.PageController.PageArea.Company.ShortName,
CDNAddress = cDNAddress
},
PartMetaVM = pde.PageAction.PageController.PageArea.Company.CompanySettings
.Select(cse => new PartMetaVM
{
ShortName = pde.PageAction.PageController.PageArea.Company.ShortName,
ShortDescription = pde.ShortDescription,
LongDescription = pde.LongDescription,
Keywords = pde.Keywords,
MsValidate = cse.MsValidate,
FbAppID = cse.FbAppID,
CanonicalPath = cse.PrimaryDomain + "/" + canonicalPath,
OgImage = cse.PrimaryDomain + "/" + pde.OgImage,
ThemeColor = cse.ThemeColor
})
.FirstOrDefault(),
PartLinksVM = new PartLinksVM
{
CanonicalPath = pde.PageAction.PageController.PageArea.Company.CompanySettings
.Select(cse => cse.PrimaryDomain)
.FirstOrDefault() + "/" + canonicalPath,
},
PartBreadcrumbVM = new PartBreadcrumbVM
{
BreadcrumbImage = cDNAddress + pde.BreadcrumbImage,
Area = (routeDetails.Area ?? "Home"),
Controller = routeDetails.Controller,
Action = routeDetails.Action,
Title = pde.Title,
TagLine = pde.TagLine
},
PartFooterVM = new PartFooterVM
{
CDNAddress = cDNAddress,
DataCompanyAddressVM = pde.PageAction.PageController.PageArea.Company.CompanyAddress
.Select(cad => new DataCompanyAddressVM
{
ShortName = cad.Company.ShortName,
LongName = cad.Company.LongName,
Registration = cad.Company.Registration,
AddressLine1 = cad.AddressLine1,
AddressLine2 = cad.AddressLine2,
AddressLine3 = cad.AddressLine3,
AddressLine4 = cad.AddressLine4,
Postcode = cad.Postcode,
Phone = cad.Phone
})
.FirstOrDefault(),
DataCompanySocialVM = pde.PageAction.PageController.PageArea.Company.CompanySocial
.Select(cso => new DataCompanySocialVM
{
FacebookAddress = cso.FacebookAddress,
LinkedInAddress = cso.LinkedInAddress,
TwitterAddress = cso.LinkedInAddress
})
.FirstOrDefault()
}
})
.FirstAsync();
return pageDetailsVM;
}
}
}
Мой вопрос заключается в том, что мне нужно сделать несколько нажатий кнопки su ch as:
pde.PageAction.PageController.PageArea.Company.CompanySettings
.Select(scs => scs.PrimaryDomain)
.FirstOrDefault(),
Когда я почти уверен, что могу использовать .Включите в начало некоторые способы использования и использования a. вместо этого записанное значение.
Но я не могу понять, как.
Я надеюсь, что это имеет смысл, и любая обратная связь будет оценена.
Редактировать - так что просто построить на этом, в основном, у меня есть макет, который строит все биты из класса layoutvm, а затем передает все «биты» всем частям
<body class="loading-overlay-showing" data-plugin-page-transition data-loading-overlay data-plugin-options="{'hideDelay': 500}">
@Html.Partial("~/Views/Shared/DisplayTemplates/_Loader.cshtml")
<div class="body">
@if (isCustomerArea)
{
@Html.Partial("~/Areas/Customer/Views/Shared/DisplayTemplates/_Header.cshtml", Model.DataPageDetailsVM.PartHeaderVM)
}
else
{
@Html.Partial("~/Views/Shared/DisplayTemplates/_Header.cshtml", Model.DataPageDetailsVM.PartHeaderVM)
}
<main>
@if ((ViewContext.RouteData.Values["controller"].ToString() == "Home" && ViewContext.RouteData.Values["action"].ToString() != "Index") || ViewContext.RouteData.Values["controller"].ToString() != "Home")
{
@Html.Partial("~/Views/Shared/DisplayTemplates/_Breadcrumb.cshtml", Model.DataPageDetailsVM.PartBreadcrumbVM)
}
@RenderBody()
</main>
@if (isCustomerArea)
{
@Html.Partial("~/Areas/Customer/Views/Shared/DisplayTemplates/_Footer.cshtml", Model.DataPageDetailsVM.PartFooterVM)
}
else
{
@Html.Partial("~/Views/Shared/DisplayTemplates/_Footer.cshtml", Model.DataPageDetailsVM.PartFooterVM)
}
</div>
<section>
@Scripts.Render(Model.DataPageDetailsVM.CDNAddress + "Common/js-footer")
@Scripts.Render(Model.DataPageDetailsVM.CDNAddress + CompanyDetails.COMPANYID + "/js-footer")
@RenderSection("scripts", required: false)
</section>
У меня есть класс макета:
public abstract class LayoutVM
{
public virtual DataPageDetailsVM DataPageDetailsVM { get; set; }
}
, который вытягивает все биты.
Затем каждая страница наследуется от этого макета vm:
public class PageRetailVM : LayoutVM
{
public SuggestedServicesVM SuggestedServicesVM { get; set; }
}
тогда мой контроллер страницы становится очень простым, не только Я получаю доступ ко всем данным макета, но код страницы становится очень маленьким:
[HttpGet]
[AllowAnonymous]
public async Task<ActionResult> Retail()
{
PageRetailVM pageRetailVM = new PageRetailVM
{
DataPageDetailsVM = await PageDetails.Get(CompanyDetails.COMPANYID, ControllerContext),
SuggestedServicesVM = await PartSuggestedServices.Get(CompanyDetails.COMPANYID, ControllerContext)
};
return View(pageRetailVM);
}
Вот для чего предназначен класс PageDetails