ارتقاء به ASP.NET Core 1.0 - قسمت 13 - معرفی View Components
نویسنده: وحید نصیری
تاریخ: ۱۳۹۵/۰۴/۲۸ ۱۲:۴۵
آدرس: www.dntips.ir
| مطالب | ۳۶۹۴ |
| نویسندگان | ۲۷۶ |
| گروههای مطالب | ۱۰۲۴ |
| نقشههای راه | ۱۱۹ |
| دورهها | ۱۴ |
| اشتراکها | ۱۷۹۱۴ |
public partial class SidebarMenuController : Controller
{
const int Min15 = 900;
[ChildActionOnly]
[OutputCache(Duration = Min15)]
public virtual ActionResult Index()
{
return PartialView("_SidebarMenu");
}
}
using System.Threading.Tasks;
using Microsoft.AspNetCore.Mvc;
using Core1RtmEmptyTest.Services;
namespace Core1RtmEmptyTest.ViewComponents
{
public class SiteCopyright : ViewComponent
{
private readonly IMessagesService _messagesService;
public SiteCopyright(IMessagesService messagesService)
{
_messagesService = messagesService;
}
public IViewComponentResult Invoke(int numberToTake)
{
var name = _messagesService.GetSiteName();
return View(viewName: "Default", model: name);
}
//public async Task<IViewComponentResult> InvokeAsync(int numberToTake)
//{
// return View();
//}
}
} /Views/Shared/Components/[NameOfComponent]/Default.cshtml
/Views/[CurrentController]/Components/[NameOfComponent]/Default.cshtml
<footer>
<p>@await Component.InvokeAsync("SiteCopyright", new { numberToTake = 5 })</p>
</footer> [ViewComponent]
public abstract class ViewComponent
{
protected ViewComponent();
public HttpContext HttpContext { get; }
public ModelStateDictionary ModelState { get; }
public HttpRequest Request { get; }
public RouteData RouteData { get; }
public IUrlHelper Url { get; set; }
public IPrincipal User { get; }
[Dynamic]
public dynamic ViewBag { get; }
[ViewComponentContext]
public ViewComponentContext ViewComponentContext { get; set; }
public ViewContext ViewContext { get; }
public ViewDataDictionary ViewData { get; }
public ICompositeViewEngine ViewEngine { get; set; }
//...
} public IActionResult AddURLTest()
{
return ViewComponent("AddURL");
} $(document).ready (function(){
$("#LoadSignIn").click(function(){
$('#UserControl').load("/Home/AddURLTest");
});
}); "dependencies": {
"NETStandard.Library": "1.6.0",
"Microsoft.AspNetCore.Mvc": "1.0.0",
"Microsoft.AspNetCore.Razor.Tools": {
"version": "1.0.0-preview2-final",
"type": "build"
}
},
"tools": {
"Microsoft.AspNetCore.Razor.Tools": "1.0.0-preview2-final"
} "buildOptions": {
"embed": "Views/**/*.cshtml"
} public void ConfigureServices(IServiceCollection services)
{
services.AddMvc();
//Get a reference to the assembly that contains the view components
var assembly = typeof(ViewComponentLibrary.ViewComponents.SimpleViewComponent).GetTypeInfo().Assembly;
//Create an EmbeddedFileProvider for that assembly
var embeddedFileProvider = new EmbeddedFileProvider(assembly,"ViewComponentLibrary");
//Add the file provider to the Razor view engine
services.Configure<RazorViewEngineOptions>(options =>
{
options.FileProviders.Add(embeddedFileProvider);
}); [ViewComponent(Name = "ViewComponentLibrary.Simple")] public class SimpleViewComponent : ViewComponent
@await Component.InvokeAsync("ViewComponentLibrary.Simple", new { number = 5 }) @await Component.InvokeAsync("SiteCopyright", new { numberToTake = 5 }) <vc:site-copyright number-to-take="5"></vc:site-copyright>
@addTagHelper *,Core1RtmEmptyTest
<Project Sdk="Microsoft.NET.Sdk.Web">
<ItemGroup>
<EmbeddedResource Include="Views\**\*.cshtml" />
</ItemGroup>
<ItemGroup>
<PackageReference Include="Microsoft.AspNetCore.Mvc" Version="1.1.2" />
</ItemGroup>
</Project> <div id="dynamicContentContainer"></div>
<script>
$.get('@Url.Action("GetData", "Home")', {id : 1}, function(content){
$("#dynamicContentContainer").html(content);
});
</script> [HttpGet]
public IActionResult GetData(int id)
{
return PartialView(id);
} @model int <span>Values from controler :</span> @Model
return View(viewName: "~/Areas/AreaName/Views/Shared/Components/OnlineUsers/Default.cshtml",model: model);
<partial name="_Menu" />
@await Component.InvokeAsync("NavBar"); public class NavbarViewComponent : ViewComponent
{
private readonly DbSet<Navbar> _navbars;
private readonly AppDbContext _dbContext;
public NavbarViewComponent(AppDbContext dbContext)
{
_dbContext = dbContext;
_navbars = _dbContext.Set<Navbar>();
}
public async Task<IViewComponentResult> InvokeAsync()
{
var model = await _navbars.ToListAsync();
return View(viewName: "~/Views/Shared/Components/NavbarViewComponent/Default.cshtml", model);
}
}
وقتی از <vc:navbar></vc:navbar> استفاده میکنم خطایی ندارم ولی ViewComponent اجرا نمیشه !!
public class Navbar
{
public int Id { get; set; }
public string Title { get; set; }
public int? ParentId { get; set; }
public virtual Navbar Parent { get; set; }
public bool IsActive { get; set; }
public bool HasChiled { get; set; }
public bool IsMegaMenu { get; set; }
public PageGroup PageGroup { get; set; }
public string Url { get; set; }
public bool OpenNewPage { get; set; }
public virtual ICollection<Navbar> Children { get; set; }
} public class TopNavbar : ViewComponent
{
private readonly DbSet<Navbar> _navbars;
private readonly AppDbContext _dbContext;
public TopNavbar(AppDbContext dbContext)
{
_dbContext = dbContext;
_navbars = _dbContext.Set<Navbar>();
}
public async Task<IViewComponentResult> InvokeAsync()
{
var navbars = await _navbars.Include(p=>p.Parent).Include(x=>x.Children).OrderBy(x=>x.ParentId).ToListAsync();
return View(viewName: "~/Views/Shared/Components/NavbarViewComponent/_Menu.cshtml", navbars);
}
} <ul class="menu">
<li>
<a href="Index_demo6.html"><i class="menu_icon_wrapper fal fa-home-lg-alt"></i>صفحه اصلی</a>
</li>
@await Component.InvokeAsync("TopNavbar");
</ul> @using TR.Context.Entities
@using Microsoft.AspNetCore.Html
@model IEnumerable<TR.Context.Entities.Navbar>
@foreach (var menu in Model.Where(x => x.Parent == null))
{
<li class="@(menu.HasChiled ? "has_sub narrow" : "")">
<a href="#">@menu.Title</a>
@if (menu.HasChiled)
{
<div class="second">
<div class="inner">
<ul>
@foreach (var menuChild in menu.Children)
{
<partial name="~/Views/Shared/Components/NavbarViewComponent/_SubMenu.cshtml" model="menuChild" />
}
</ul>
</div>
</div>
}
</li>
} @model TR_.Context.Entities.Navbar
<li class="@(Model.HasChiled ? "sub":"")">
<a href="#">
@if (Model.Children.Any())
{<i class="q_menu_arrow fal fa-angle-left"></i>}
@Model.Title
</a>
@if (Model.Children.Any())
{
<ul>
@foreach (var menuChild in Model.Children)
{
<partial name="~/Views/Shared/Components/NavbarViewComponent/_SubMenu.cshtml" model="menuChild" />
}
</ul>
}
</li>