Blazor 5x - قسمت 26 - برنامهی Blazor WASM - ایجاد و تنظیمات اولیه
نویسنده: وحید نصیری
تاریخ: ۱۴۰۰/۰۱/۰۳ ۱۵:۳۰
آدرس: www.dntips.ir
| مطالب | ۳۶۹۴ |
| نویسندگان | ۲۷۶ |
| گروههای مطالب | ۱۰۲۴ |
| نقشههای راه | ۱۱۹ |
| دورهها | ۱۴ |
| اشتراکها | ۱۷۹۱۴ |
@import url('open-iconic/font/css/open-iconic-bootstrap.min.css'); dotnet tool update -g Microsoft.Web.LibraryManager.Cli libman init libman install bootstrap --provider unpkg --destination wwwroot/lib/bootstrap libman install open-iconic --provider unpkg --destination wwwroot/lib/open-iconic libman install jquery --provider unpkg --destination wwwroot/lib/jquery libman install toastr --provider unpkg --destination wwwroot/lib/toastr
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
<meta
name="viewport"
content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no"
/>
<title>BlazorWasm.Client</title>
<base href="/" />
<link href="lib/toastr/build/toastr.min.css" rel="stylesheet" />
<link
href="lib/open-iconic/font/css/open-iconic-bootstrap.min.css"
rel="stylesheet"
/>
<link href="lib/bootstrap/dist/css/bootstrap.min.css" rel="stylesheet" />
<link href="css/app.css" rel="stylesheet" />
<link href="BlazorWasm.Client.styles.css" rel="stylesheet" />
</head>
<body>
<div id="app">Loading...</div>
<div id="blazor-error-ui">
An unhandled error has occurred.
<a href="" class="reload">Reload</a>
<a class="dismiss">🗙</a>
</div>
<script src="lib/jquery/dist/jquery.min.js"></script>
<script src="lib/toastr/build/toastr.min.js"></script>
<script src="js/common.js"></script>
<script src="_framework/blazor.webassembly.js"></script>
</body>
</html> .valid.modified:not([type="checkbox"]) {
outline: 1px solid #26b050;
}
.invalid {
outline: 1px solid red;
}
.validation-message {
color: red;
}
#blazor-error-ui {
background: lightyellow;
bottom: 0;
box-shadow: 0 -1px 2px rgba(0, 0, 0, 0.2);
display: none;
left: 0;
padding: 0.6rem 1.25rem 0.7rem 1.25rem;
position: fixed;
width: 100%;
z-index: 1000;
}
#blazor-error-ui .dismiss {
cursor: pointer;
position: absolute;
right: 0.75rem;
top: 0.5rem;
}
.spinner {
border: 16px solid silver !important;
border-top: 16px solid #337ab7 !important;
border-radius: 50% !important;
width: 80px !important;
height: 80px !important;
animation: spin 700ms linear infinite !important;
top: 50% !important;
left: 50% !important;
transform: translate(-50%, -50%);
position: absolute !important;
}
@keyframes spin {
0% {
transform: rotate(0deg);
}
100% {
transform: rotate(360deg);
}
}
.room-image {
display: block;
width: 100%;
height: 150px;
background-size: cover !important;
border: 3px solid green;
position: relative;
}
.room-image-title {
position: absolute;
top: 0;
right: 0;
background-color: green;
color: white;
padding: 0px 6px;
display: inline-block;
} window.ShowToastr = (type, message) => {
if (type === "success") {
toastr.success(message, "Operation Successful", { timeOut: 10000 });
}
if (type === "error") {
toastr.error(message, "Operation Failed", { timeOut: 10000 });
}
}; @using BlazorWasm.Client.Utils
@inherits LayoutComponentBase <NavMenu /> <div> @Body </div>
<nav class="navbar navbar-expand-sm navbar-dark bg-dark p-0">
<a class="navbar-brand mx-4" href="#">Navbar</a>
<button class="navbar-toggler" type="button" data-toggle="collapse"
data-target="#navbarSupportedContent"
aria-controls="navbarSupportedContent"
aria-expanded="false"
aria-label="Toggle navigation">
<span class="navbar-toggler-icon"></span>
</button>
<div class="collapse navbar-collapse pr-2" id="navbarSupportedContent">
<ul class="navbar-nav mr-auto"></ul>
<ul class="my-0 navbar-nav">
<li class="nav-item p-0">
<NavLink class="nav-link" href="registration">
<span class="p-2">
Register
</span>
</NavLink>
</li>
<li class="nav-item p-0">
<NavLink class="nav-link" href="login">
<span class="p-2">
Login
</span>
</NavLink>
</li>
</ul>
</div>
</nav>
@page "/"
<form>
<div class="row p-0 mx-0 mt-4">
<div class="col-12 col-md-5 offset-md-1 pl-2 pr-2 pr-md-0">
<div class="form-group">
<label>Check In Date</label>
<input type="text" class="form-control" />
</div>
</div>
<div class="col-8 col-md-3 pl-2 pr-2">
<div class="form-group">
<label>No. of nights</label>
<select class="form-control">
@for (var i = 1; i <= 10; i++)
{
<option value="@i">@i</option>
}
</select>
</div>
</div>
<div class="col-4 col-md-2 p-0 pr-2">
<div class="form-group">
<label> </label>
<input type="submit" value="Go" class="btn btn-success btn-block" />
</div>
</div>
</div>
</form> using System;
namespace BlazorWasm.Client.Models.ViewModels
{
public class HomeVM
{
public DateTime StartDate { get; set; } = DateTime.Now;
public DateTime EndDate { get; set; }
public int NoOfNights { get; set; } = 1;
}
} using BlazorWasm.Client.Models.ViewModels
@code{
HomeVM HomeModel = new HomeVM();
} <EditForm Model="HomeModel"> // ... </EditForm>
<InputDate min="@DateTime.Now.ToString("yyyy-MM-dd")"
@bind-Value="HomeModel.StartDate"
type="text"
class="form-control" /> <select @bind="HomeModel.NoOfNights">
dotnet add package Blazored.LocalStorage
namespace BlazorWasm.Client
{
public class Program
{
public static async Task Main(string[] args)
{
var builder = WebAssemblyHostBuilder.CreateDefault(args);
// ...
builder.Services.AddBlazoredLocalStorage();
// ...
}
}
} @using Blazored.LocalStorage
@page "/" @inject ILocalStorageService LocalStorage @inject IJSRuntime JsRuntime <EditForm Model="HomeModel" OnValidSubmit="SaveInitialData">
@code{
HomeVM HomeModel = new HomeVM();
private async Task SaveInitialData()
{
try
{
HomeModel.EndDate = HomeModel.StartDate.AddDays(HomeModel.NoOfNights);
await LocalStorage.SetItemAsync("InitialRoomBookingInfo", HomeModel);
}
catch (Exception e)
{
await JsRuntime.ToastrError(e.Message);
}
}
}
namespace BlazorServer.Common
{
public static class ConstantKeys
{
public const string LocalInitialBooking = "InitialRoomBookingInfo";
}
} <Project Sdk="Microsoft.NET.Sdk.BlazorWebAssembly">
<ItemGroup>
<ProjectReference Include="..\..\BlazorServer\BlazorServer.Common\BlazorServer.Common.csproj" />
</ItemGroup>
</Project> @using BlazorServer.Common
await LocalStorage.SetItemAsync(ConstantKeys.LocalInitialBooking, HomeModel);
@page "/hotel/rooms"
<h3>HotelRooms</h3>
@code {
} @page "/"
@inject ILocalStorageService LocalStorage
@inject IJSRuntime JsRuntime
@inject NavigationManager NavigationManager
@code{
HomeVM HomeModel = new HomeVM();
private async Task SaveInitialData()
{
try
{
HomeModel.EndDate = HomeModel.StartDate.AddDays(HomeModel.NoOfNights);
await LocalStorage.SetItemAsync(ConstantKeys.LocalInitialBooking, HomeModel);
NavigationManager.NavigateTo("hotel/rooms");
}
catch (Exception e)
{
await JsRuntime.ToastrError(e.Message);
}
}
} @inject IJSRuntime JSRuntime
@code {
string currentInputValue;
public async Task Save()
{
await JSRuntime.InvokeVoidAsync("localStorage.setItem", "name", currentInputValue);
}
public async Task Read()
{
currentInputValue = await JSRuntime.InvokeAsync<string>("localStorage.getItem", "name");
}
public async Task Delete()
{
await JSRuntime.InvokeAsync<string>("localStorage.removeItem", "name");
}
} @using Microsoft.AspNetCore.Components.Server.ProtectedBrowserStorage
@inject ProtectedLocalStorage BrowserStorage
@code {
string currentInputValue;
public async Task Save()
{
await BrowserStorage.SetAsync("name", currentInputValue);
}
public async Task Read()
{
var result = await BrowserStorage.GetAsync<string>("name");
currentInputValue = result.Success ? result.Value : "";
}
public async Task Delete()
{
await BrowserStorage.DeleteAsync("name");
}
} @inject ProtectedSessionStorage BrowserStorage