feat: create S7 simulator solution structure
- Add Core, Application, Server, Web, UnitTests projects
- Configure project references
- Add required NuGet packages (HslCommunication, Serilog, AutoMapper, SignalR)
- All projects targeting .NET 6.0
- Solution builds successfully with 0 errors
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | namespace WIDESEAWCS_S7Simulator.Application; |
| | | public class Class1 |
| | | { |
| | | |
| | | } |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | <Project Sdk="Microsoft.NET.Sdk"> |
| | | |
| | | <ItemGroup> |
| | | <ProjectReference Include="..\WIDESEAWCS_S7Simulator.Core\WIDESEAWCS_S7Simulator.Core.csproj" /> |
| | | </ItemGroup> |
| | | |
| | | <PropertyGroup> |
| | | <TargetFramework>net6.0</TargetFramework> |
| | | <ImplicitUsings>enable</ImplicitUsings> |
| | | <Nullable>enable</Nullable> |
| | | </PropertyGroup> |
| | | |
| | | </Project> |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | namespace WIDESEAWCS_S7Simulator.Core; |
| | | public class Class1 |
| | | { |
| | | |
| | | } |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | <Project Sdk="Microsoft.NET.Sdk"> |
| | | |
| | | <PropertyGroup> |
| | | <TargetFramework>net6.0</TargetFramework> |
| | | <ImplicitUsings>enable</ImplicitUsings> |
| | | <Nullable>enable</Nullable> |
| | | </PropertyGroup> |
| | | |
| | | <ItemGroup> |
| | | <PackageReference Include="HslCommunication" Version="12.6.3" /> |
| | | <PackageReference Include="Microsoft.Extensions.Configuration.Abstractions" Version="10.0.5" /> |
| | | <PackageReference Include="Microsoft.Extensions.Logging.Abstractions" Version="10.0.5" /> |
| | | <PackageReference Include="Newtonsoft.Json" Version="13.0.4" /> |
| | | </ItemGroup> |
| | | |
| | | </Project> |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | using Microsoft.AspNetCore.Mvc; |
| | | |
| | | namespace WIDESEAWCS_S7Simulator.Server.Controllers; |
| | | |
| | | [ApiController] |
| | | [Route("[controller]")] |
| | | public class WeatherForecastController : ControllerBase |
| | | { |
| | | private static readonly string[] Summaries = new[] |
| | | { |
| | | "Freezing", "Bracing", "Chilly", "Cool", "Mild", "Warm", "Balmy", "Hot", "Sweltering", "Scorching" |
| | | }; |
| | | |
| | | private readonly ILogger<WeatherForecastController> _logger; |
| | | |
| | | public WeatherForecastController(ILogger<WeatherForecastController> logger) |
| | | { |
| | | _logger = logger; |
| | | } |
| | | |
| | | [HttpGet(Name = "GetWeatherForecast")] |
| | | public IEnumerable<WeatherForecast> Get() |
| | | { |
| | | return Enumerable.Range(1, 5).Select(index => new WeatherForecast |
| | | { |
| | | Date = DateTime.Now.AddDays(index), |
| | | TemperatureC = Random.Shared.Next(-20, 55), |
| | | Summary = Summaries[Random.Shared.Next(Summaries.Length)] |
| | | }) |
| | | .ToArray(); |
| | | } |
| | | } |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | var builder = WebApplication.CreateBuilder(args); |
| | | |
| | | // Add services to the container. |
| | | |
| | | builder.Services.AddControllers(); |
| | | // Learn more about configuring Swagger/OpenAPI at https://aka.ms/aspnetcore/swashbuckle |
| | | builder.Services.AddEndpointsApiExplorer(); |
| | | builder.Services.AddSwaggerGen(); |
| | | |
| | | var app = builder.Build(); |
| | | |
| | | // Configure the HTTP request pipeline. |
| | | if (app.Environment.IsDevelopment()) |
| | | { |
| | | app.UseSwagger(); |
| | | app.UseSwaggerUI(); |
| | | } |
| | | |
| | | app.UseHttpsRedirection(); |
| | | |
| | | app.UseAuthorization(); |
| | | |
| | | app.MapControllers(); |
| | | |
| | | app.Run(); |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | { |
| | | "$schema": "https://json.schemastore.org/launchsettings.json", |
| | | "iisSettings": { |
| | | "windowsAuthentication": false, |
| | | "anonymousAuthentication": true, |
| | | "iisExpress": { |
| | | "applicationUrl": "http://localhost:36293", |
| | | "sslPort": 44331 |
| | | } |
| | | }, |
| | | "profiles": { |
| | | "WIDESEAWCS_S7Simulator.Server": { |
| | | "commandName": "Project", |
| | | "dotnetRunMessages": true, |
| | | "launchBrowser": true, |
| | | "launchUrl": "swagger", |
| | | "applicationUrl": "https://localhost:7225;http://localhost:5137", |
| | | "environmentVariables": { |
| | | "ASPNETCORE_ENVIRONMENT": "Development" |
| | | } |
| | | }, |
| | | "IIS Express": { |
| | | "commandName": "IISExpress", |
| | | "launchBrowser": true, |
| | | "launchUrl": "swagger", |
| | | "environmentVariables": { |
| | | "ASPNETCORE_ENVIRONMENT": "Development" |
| | | } |
| | | } |
| | | } |
| | | } |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | <Project Sdk="Microsoft.NET.Sdk.Web"> |
| | | |
| | | <PropertyGroup> |
| | | <TargetFramework>net6.0</TargetFramework> |
| | | <Nullable>enable</Nullable> |
| | | <ImplicitUsings>enable</ImplicitUsings> |
| | | </PropertyGroup> |
| | | |
| | | <ItemGroup> |
| | | <PackageReference Include="AutoMapper" Version="16.1.0" /> |
| | | <PackageReference Include="Microsoft.AspNetCore.SignalR" Version="1.2.9" /> |
| | | <PackageReference Include="Serilog.AspNetCore" Version="10.0.0" /> |
| | | <PackageReference Include="Swashbuckle.AspNetCore" Version="6.5.0" /> |
| | | </ItemGroup> |
| | | |
| | | <ItemGroup> |
| | | <ProjectReference Include="..\WIDESEAWCS_S7Simulator.Core\WIDESEAWCS_S7Simulator.Core.csproj" /> |
| | | <ProjectReference Include="..\WIDESEAWCS_S7Simulator.Application\WIDESEAWCS_S7Simulator.Application.csproj" /> |
| | | </ItemGroup> |
| | | |
| | | </Project> |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | namespace WIDESEAWCS_S7Simulator.Server; |
| | | |
| | | public class WeatherForecast |
| | | { |
| | | public DateTime Date { get; set; } |
| | | |
| | | public int TemperatureC { get; set; } |
| | | |
| | | public int TemperatureF => 32 + (int)(TemperatureC / 0.5556); |
| | | |
| | | public string? Summary { get; set; } |
| | | } |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | { |
| | | "Logging": { |
| | | "LogLevel": { |
| | | "Default": "Information", |
| | | "Microsoft.AspNetCore": "Warning" |
| | | } |
| | | } |
| | | } |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | { |
| | | "Logging": { |
| | | "LogLevel": { |
| | | "Default": "Information", |
| | | "Microsoft.AspNetCore": "Warning" |
| | | } |
| | | }, |
| | | "AllowedHosts": "*" |
| | | } |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | namespace WIDESEAWCS_S7Simulator.UnitTests; |
| | | |
| | | public class UnitTest1 |
| | | { |
| | | [Fact] |
| | | public void Test1() |
| | | { |
| | | |
| | | } |
| | | } |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | global using Xunit; |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | <Project Sdk="Microsoft.NET.Sdk"> |
| | | |
| | | <PropertyGroup> |
| | | <TargetFramework>net6.0</TargetFramework> |
| | | <ImplicitUsings>enable</ImplicitUsings> |
| | | <Nullable>enable</Nullable> |
| | | |
| | | <IsPackable>false</IsPackable> |
| | | </PropertyGroup> |
| | | |
| | | <ItemGroup> |
| | | <PackageReference Include="Microsoft.NET.Test.Sdk" Version="17.1.0" /> |
| | | <PackageReference Include="xunit" Version="2.4.1" /> |
| | | <PackageReference Include="xunit.runner.visualstudio" Version="2.4.3"> |
| | | <IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets> |
| | | <PrivateAssets>all</PrivateAssets> |
| | | </PackageReference> |
| | | <PackageReference Include="coverlet.collector" Version="3.1.2"> |
| | | <IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets> |
| | | <PrivateAssets>all</PrivateAssets> |
| | | </PackageReference> |
| | | </ItemGroup> |
| | | |
| | | <ItemGroup> |
| | | <ProjectReference Include="..\WIDESEAWCS_S7Simulator.Core\WIDESEAWCS_S7Simulator.Core.csproj" /> |
| | | </ItemGroup> |
| | | |
| | | </Project> |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | @page |
| | | @model ErrorModel |
| | | @{ |
| | | ViewData["Title"] = "Error"; |
| | | } |
| | | |
| | | <h1 class="text-danger">Error.</h1> |
| | | <h2 class="text-danger">An error occurred while processing your request.</h2> |
| | | |
| | | @if (Model.ShowRequestId) |
| | | { |
| | | <p> |
| | | <strong>Request ID:</strong> <code>@Model.RequestId</code> |
| | | </p> |
| | | } |
| | | |
| | | <h3>Development Mode</h3> |
| | | <p> |
| | | Swapping to the <strong>Development</strong> environment displays detailed information about the error that occurred. |
| | | </p> |
| | | <p> |
| | | <strong>The Development environment shouldn't be enabled for deployed applications.</strong> |
| | | It can result in displaying sensitive information from exceptions to end users. |
| | | For local debugging, enable the <strong>Development</strong> environment by setting the <strong>ASPNETCORE_ENVIRONMENT</strong> environment variable to <strong>Development</strong> |
| | | and restarting the app. |
| | | </p> |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | using System.Diagnostics; |
| | | using Microsoft.AspNetCore.Mvc; |
| | | using Microsoft.AspNetCore.Mvc.RazorPages; |
| | | |
| | | namespace WIDESEAWCS_S7Simulator.Web.Pages; |
| | | |
| | | [ResponseCache(Duration = 0, Location = ResponseCacheLocation.None, NoStore = true)] |
| | | [IgnoreAntiforgeryToken] |
| | | public class ErrorModel : PageModel |
| | | { |
| | | public string? RequestId { get; set; } |
| | | |
| | | public bool ShowRequestId => !string.IsNullOrEmpty(RequestId); |
| | | |
| | | private readonly ILogger<ErrorModel> _logger; |
| | | |
| | | public ErrorModel(ILogger<ErrorModel> logger) |
| | | { |
| | | _logger = logger; |
| | | } |
| | | |
| | | public void OnGet() |
| | | { |
| | | RequestId = Activity.Current?.Id ?? HttpContext.TraceIdentifier; |
| | | } |
| | | } |
| | | |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | @page |
| | | @model IndexModel |
| | | @{ |
| | | ViewData["Title"] = "Home page"; |
| | | } |
| | | |
| | | <div class="text-center"> |
| | | <h1 class="display-4">Welcome</h1> |
| | | <p>Learn about <a href="https://docs.microsoft.com/aspnet/core">building Web apps with ASP.NET Core</a>.</p> |
| | | </div> |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | using Microsoft.AspNetCore.Mvc; |
| | | using Microsoft.AspNetCore.Mvc.RazorPages; |
| | | |
| | | namespace WIDESEAWCS_S7Simulator.Web.Pages; |
| | | |
| | | public class IndexModel : PageModel |
| | | { |
| | | private readonly ILogger<IndexModel> _logger; |
| | | |
| | | public IndexModel(ILogger<IndexModel> logger) |
| | | { |
| | | _logger = logger; |
| | | } |
| | | |
| | | public void OnGet() |
| | | { |
| | | |
| | | } |
| | | } |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | @page |
| | | @model PrivacyModel |
| | | @{ |
| | | ViewData["Title"] = "Privacy Policy"; |
| | | } |
| | | <h1>@ViewData["Title"]</h1> |
| | | |
| | | <p>Use this page to detail your site's privacy policy.</p> |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | using Microsoft.AspNetCore.Mvc; |
| | | using Microsoft.AspNetCore.Mvc.RazorPages; |
| | | |
| | | namespace WIDESEAWCS_S7Simulator.Web.Pages; |
| | | |
| | | public class PrivacyModel : PageModel |
| | | { |
| | | private readonly ILogger<PrivacyModel> _logger; |
| | | |
| | | public PrivacyModel(ILogger<PrivacyModel> logger) |
| | | { |
| | | _logger = logger; |
| | | } |
| | | |
| | | public void OnGet() |
| | | { |
| | | } |
| | | } |
| | | |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | <!DOCTYPE html> |
| | | <html lang="en"> |
| | | <head> |
| | | <meta charset="utf-8" /> |
| | | <meta name="viewport" content="width=device-width, initial-scale=1.0" /> |
| | | <title>@ViewData["Title"] - WIDESEAWCS_S7Simulator.Web</title> |
| | | <link rel="stylesheet" href="~/lib/bootstrap/dist/css/bootstrap.min.css" /> |
| | | <link rel="stylesheet" href="~/css/site.css" asp-append-version="true" /> |
| | | <link rel="stylesheet" href="~/WIDESEAWCS_S7Simulator.Web.styles.css" asp-append-version="true" /> |
| | | </head> |
| | | <body> |
| | | <header> |
| | | <nav class="navbar navbar-expand-sm navbar-toggleable-sm navbar-light bg-white border-bottom box-shadow mb-3"> |
| | | <div class="container"> |
| | | <a class="navbar-brand" asp-area="" asp-page="/Index">WIDESEAWCS_S7Simulator.Web</a> |
| | | <button class="navbar-toggler" type="button" data-bs-toggle="collapse" data-bs-target=".navbar-collapse" aria-controls="navbarSupportedContent" |
| | | aria-expanded="false" aria-label="Toggle navigation"> |
| | | <span class="navbar-toggler-icon"></span> |
| | | </button> |
| | | <div class="navbar-collapse collapse d-sm-inline-flex justify-content-between"> |
| | | <ul class="navbar-nav flex-grow-1"> |
| | | <li class="nav-item"> |
| | | <a class="nav-link text-dark" asp-area="" asp-page="/Index">Home</a> |
| | | </li> |
| | | <li class="nav-item"> |
| | | <a class="nav-link text-dark" asp-area="" asp-page="/Privacy">Privacy</a> |
| | | </li> |
| | | </ul> |
| | | </div> |
| | | </div> |
| | | </nav> |
| | | </header> |
| | | <div class="container"> |
| | | <main role="main" class="pb-3"> |
| | | @RenderBody() |
| | | </main> |
| | | </div> |
| | | |
| | | <footer class="border-top footer text-muted"> |
| | | <div class="container"> |
| | | © 2026 - WIDESEAWCS_S7Simulator.Web - <a asp-area="" asp-page="/Privacy">Privacy</a> |
| | | </div> |
| | | </footer> |
| | | |
| | | <script src="~/lib/jquery/dist/jquery.min.js"></script> |
| | | <script src="~/lib/bootstrap/dist/js/bootstrap.bundle.min.js"></script> |
| | | <script src="~/js/site.js" asp-append-version="true"></script> |
| | | |
| | | @await RenderSectionAsync("Scripts", required: false) |
| | | </body> |
| | | </html> |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | /* Please see documentation at https://docs.microsoft.com/aspnet/core/client-side/bundling-and-minification |
| | | for details on configuring this project to bundle and minify static web assets. */ |
| | | |
| | | a.navbar-brand { |
| | | white-space: normal; |
| | | text-align: center; |
| | | word-break: break-all; |
| | | } |
| | | |
| | | a { |
| | | color: #0077cc; |
| | | } |
| | | |
| | | .btn-primary { |
| | | color: #fff; |
| | | background-color: #1b6ec2; |
| | | border-color: #1861ac; |
| | | } |
| | | |
| | | .nav-pills .nav-link.active, .nav-pills .show > .nav-link { |
| | | color: #fff; |
| | | background-color: #1b6ec2; |
| | | border-color: #1861ac; |
| | | } |
| | | |
| | | .border-top { |
| | | border-top: 1px solid #e5e5e5; |
| | | } |
| | | .border-bottom { |
| | | border-bottom: 1px solid #e5e5e5; |
| | | } |
| | | |
| | | .box-shadow { |
| | | box-shadow: 0 .25rem .75rem rgba(0, 0, 0, .05); |
| | | } |
| | | |
| | | button.accept-policy { |
| | | font-size: 1rem; |
| | | line-height: inherit; |
| | | } |
| | | |
| | | .footer { |
| | | position: absolute; |
| | | bottom: 0; |
| | | width: 100%; |
| | | white-space: nowrap; |
| | | line-height: 60px; |
| | | } |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | <script src="~/lib/jquery-validation/dist/jquery.validate.min.js"></script> |
| | | <script src="~/lib/jquery-validation-unobtrusive/jquery.validate.unobtrusive.min.js"></script> |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | @using WIDESEAWCS_S7Simulator.Web |
| | | @namespace WIDESEAWCS_S7Simulator.Web.Pages |
| | | @addTagHelper *, Microsoft.AspNetCore.Mvc.TagHelpers |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | @{ |
| | | Layout = "_Layout"; |
| | | } |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | var builder = WebApplication.CreateBuilder(args); |
| | | |
| | | // Add services to the container. |
| | | builder.Services.AddRazorPages(); |
| | | |
| | | var app = builder.Build(); |
| | | |
| | | // Configure the HTTP request pipeline. |
| | | if (!app.Environment.IsDevelopment()) |
| | | { |
| | | app.UseExceptionHandler("/Error"); |
| | | // The default HSTS value is 30 days. You may want to change this for production scenarios, see https://aka.ms/aspnetcore-hsts. |
| | | app.UseHsts(); |
| | | } |
| | | |
| | | app.UseHttpsRedirection(); |
| | | app.UseStaticFiles(); |
| | | |
| | | app.UseRouting(); |
| | | |
| | | app.UseAuthorization(); |
| | | |
| | | app.MapRazorPages(); |
| | | |
| | | app.Run(); |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | { |
| | | "iisSettings": { |
| | | "windowsAuthentication": false, |
| | | "anonymousAuthentication": true, |
| | | "iisExpress": { |
| | | "applicationUrl": "http://localhost:39416", |
| | | "sslPort": 44392 |
| | | } |
| | | }, |
| | | "profiles": { |
| | | "WIDESEAWCS_S7Simulator.Web": { |
| | | "commandName": "Project", |
| | | "dotnetRunMessages": true, |
| | | "launchBrowser": true, |
| | | "applicationUrl": "https://localhost:7054;http://localhost:5137", |
| | | "environmentVariables": { |
| | | "ASPNETCORE_ENVIRONMENT": "Development" |
| | | } |
| | | }, |
| | | "IIS Express": { |
| | | "commandName": "IISExpress", |
| | | "launchBrowser": true, |
| | | "environmentVariables": { |
| | | "ASPNETCORE_ENVIRONMENT": "Development" |
| | | } |
| | | } |
| | | } |
| | | } |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | <Project Sdk="Microsoft.NET.Sdk.Web"> |
| | | |
| | | <ItemGroup> |
| | | <ProjectReference Include="..\WIDESEAWCS_S7Simulator.Application\WIDESEAWCS_S7Simulator.Application.csproj" /> |
| | | </ItemGroup> |
| | | |
| | | <ItemGroup> |
| | | <PackageReference Include="Microsoft.AspNetCore.SignalR.Client" Version="10.0.5" /> |
| | | </ItemGroup> |
| | | |
| | | <PropertyGroup> |
| | | <TargetFramework>net6.0</TargetFramework> |
| | | <Nullable>enable</Nullable> |
| | | <ImplicitUsings>enable</ImplicitUsings> |
| | | </PropertyGroup> |
| | | |
| | | </Project> |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | { |
| | | "DetailedErrors": true, |
| | | "Logging": { |
| | | "LogLevel": { |
| | | "Default": "Information", |
| | | "Microsoft.AspNetCore": "Warning" |
| | | } |
| | | } |
| | | } |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | { |
| | | "Logging": { |
| | | "LogLevel": { |
| | | "Default": "Information", |
| | | "Microsoft.AspNetCore": "Warning" |
| | | } |
| | | }, |
| | | "AllowedHosts": "*" |
| | | } |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | html { |
| | | font-size: 14px; |
| | | } |
| | | |
| | | @media (min-width: 768px) { |
| | | html { |
| | | font-size: 16px; |
| | | } |
| | | } |
| | | |
| | | html { |
| | | position: relative; |
| | | min-height: 100%; |
| | | } |
| | | |
| | | body { |
| | | margin-bottom: 60px; |
| | | } |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | // Please see documentation at https://docs.microsoft.com/aspnet/core/client-side/bundling-and-minification |
| | | // for details on configuring this project to bundle and minify static web assets. |
| | | |
| | | // Write your JavaScript code. |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | The MIT License (MIT) |
| | | |
| | | Copyright (c) 2011-2021 Twitter, Inc. |
| | | Copyright (c) 2011-2021 The Bootstrap Authors |
| | | |
| | | Permission is hereby granted, free of charge, to any person obtaining a copy |
| | | of this software and associated documentation files (the "Software"), to deal |
| | | in the Software without restriction, including without limitation the rights |
| | | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell |
| | | copies of the Software, and to permit persons to whom the Software is |
| | | furnished to do so, subject to the following conditions: |
| | | |
| | | The above copyright notice and this permission notice shall be included in |
| | | all copies or substantial portions of the Software. |
| | | |
| | | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR |
| | | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, |
| | | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE |
| | | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER |
| | | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, |
| | | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN |
| | | THE SOFTWARE. |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | Copyright (c) .NET Foundation. All rights reserved. |
| | | |
| | | Licensed under the Apache License, Version 2.0 (the "License"); you may not use |
| | | these files except in compliance with the License. You may obtain a copy of the |
| | | License at |
| | | |
| | | http://www.apache.org/licenses/LICENSE-2.0 |
| | | |
| | | Unless required by applicable law or agreed to in writing, software distributed |
| | | under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR |
| | | CONDITIONS OF ANY KIND, either express or implied. See the License for the |
| | | specific language governing permissions and limitations under the License. |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | // Unobtrusive validation support library for jQuery and jQuery Validate |
| | | // Copyright (c) .NET Foundation. All rights reserved. |
| | | // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. |
| | | // @version v3.2.11 |
| | | |
| | | /*jslint white: true, browser: true, onevar: true, undef: true, nomen: true, eqeqeq: true, plusplus: true, bitwise: true, regexp: true, newcap: true, immed: true, strict: false */ |
| | | /*global document: false, jQuery: false */ |
| | | |
| | | (function (factory) { |
| | | if (typeof define === 'function' && define.amd) { |
| | | // AMD. Register as an anonymous module. |
| | | define("jquery.validate.unobtrusive", ['jquery-validation'], factory); |
| | | } else if (typeof module === 'object' && module.exports) { |
| | | // CommonJS-like environments that support module.exports |
| | | module.exports = factory(require('jquery-validation')); |
| | | } else { |
| | | // Browser global |
| | | jQuery.validator.unobtrusive = factory(jQuery); |
| | | } |
| | | }(function ($) { |
| | | var $jQval = $.validator, |
| | | adapters, |
| | | data_validation = "unobtrusiveValidation"; |
| | | |
| | | function setValidationValues(options, ruleName, value) { |
| | | options.rules[ruleName] = value; |
| | | if (options.message) { |
| | | options.messages[ruleName] = options.message; |
| | | } |
| | | } |
| | | |
| | | function splitAndTrim(value) { |
| | | return value.replace(/^\s+|\s+$/g, "").split(/\s*,\s*/g); |
| | | } |
| | | |
| | | function escapeAttributeValue(value) { |
| | | // As mentioned on http://api.jquery.com/category/selectors/ |
| | | return value.replace(/([!"#$%&'()*+,./:;<=>?@\[\\\]^`{|}~])/g, "\\$1"); |
| | | } |
| | | |
| | | function getModelPrefix(fieldName) { |
| | | return fieldName.substr(0, fieldName.lastIndexOf(".") + 1); |
| | | } |
| | | |
| | | function appendModelPrefix(value, prefix) { |
| | | if (value.indexOf("*.") === 0) { |
| | | value = value.replace("*.", prefix); |
| | | } |
| | | return value; |
| | | } |
| | | |
| | | function onError(error, inputElement) { // 'this' is the form element |
| | | var container = $(this).find("[data-valmsg-for='" + escapeAttributeValue(inputElement[0].name) + "']"), |
| | | replaceAttrValue = container.attr("data-valmsg-replace"), |
| | | replace = replaceAttrValue ? $.parseJSON(replaceAttrValue) !== false : null; |
| | | |
| | | container.removeClass("field-validation-valid").addClass("field-validation-error"); |
| | | error.data("unobtrusiveContainer", container); |
| | | |
| | | if (replace) { |
| | | container.empty(); |
| | | error.removeClass("input-validation-error").appendTo(container); |
| | | } |
| | | else { |
| | | error.hide(); |
| | | } |
| | | } |
| | | |
| | | function onErrors(event, validator) { // 'this' is the form element |
| | | var container = $(this).find("[data-valmsg-summary=true]"), |
| | | list = container.find("ul"); |
| | | |
| | | if (list && list.length && validator.errorList.length) { |
| | | list.empty(); |
| | | container.addClass("validation-summary-errors").removeClass("validation-summary-valid"); |
| | | |
| | | $.each(validator.errorList, function () { |
| | | $("<li />").html(this.message).appendTo(list); |
| | | }); |
| | | } |
| | | } |
| | | |
| | | function onSuccess(error) { // 'this' is the form element |
| | | var container = error.data("unobtrusiveContainer"); |
| | | |
| | | if (container) { |
| | | var replaceAttrValue = container.attr("data-valmsg-replace"), |
| | | replace = replaceAttrValue ? $.parseJSON(replaceAttrValue) : null; |
| | | |
| | | container.addClass("field-validation-valid").removeClass("field-validation-error"); |
| | | error.removeData("unobtrusiveContainer"); |
| | | |
| | | if (replace) { |
| | | container.empty(); |
| | | } |
| | | } |
| | | } |
| | | |
| | | function onReset(event) { // 'this' is the form element |
| | | var $form = $(this), |
| | | key = '__jquery_unobtrusive_validation_form_reset'; |
| | | if ($form.data(key)) { |
| | | return; |
| | | } |
| | | // Set a flag that indicates we're currently resetting the form. |
| | | $form.data(key, true); |
| | | try { |
| | | $form.data("validator").resetForm(); |
| | | } finally { |
| | | $form.removeData(key); |
| | | } |
| | | |
| | | $form.find(".validation-summary-errors") |
| | | .addClass("validation-summary-valid") |
| | | .removeClass("validation-summary-errors"); |
| | | $form.find(".field-validation-error") |
| | | .addClass("field-validation-valid") |
| | | .removeClass("field-validation-error") |
| | | .removeData("unobtrusiveContainer") |
| | | .find(">*") // If we were using valmsg-replace, get the underlying error |
| | | .removeData("unobtrusiveContainer"); |
| | | } |
| | | |
| | | function validationInfo(form) { |
| | | var $form = $(form), |
| | | result = $form.data(data_validation), |
| | | onResetProxy = $.proxy(onReset, form), |
| | | defaultOptions = $jQval.unobtrusive.options || {}, |
| | | execInContext = function (name, args) { |
| | | var func = defaultOptions[name]; |
| | | func && $.isFunction(func) && func.apply(form, args); |
| | | }; |
| | | |
| | | if (!result) { |
| | | result = { |
| | | options: { // options structure passed to jQuery Validate's validate() method |
| | | errorClass: defaultOptions.errorClass || "input-validation-error", |
| | | errorElement: defaultOptions.errorElement || "span", |
| | | errorPlacement: function () { |
| | | onError.apply(form, arguments); |
| | | execInContext("errorPlacement", arguments); |
| | | }, |
| | | invalidHandler: function () { |
| | | onErrors.apply(form, arguments); |
| | | execInContext("invalidHandler", arguments); |
| | | }, |
| | | messages: {}, |
| | | rules: {}, |
| | | success: function () { |
| | | onSuccess.apply(form, arguments); |
| | | execInContext("success", arguments); |
| | | } |
| | | }, |
| | | attachValidation: function () { |
| | | $form |
| | | .off("reset." + data_validation, onResetProxy) |
| | | .on("reset." + data_validation, onResetProxy) |
| | | .validate(this.options); |
| | | }, |
| | | validate: function () { // a validation function that is called by unobtrusive Ajax |
| | | $form.validate(); |
| | | return $form.valid(); |
| | | } |
| | | }; |
| | | $form.data(data_validation, result); |
| | | } |
| | | |
| | | return result; |
| | | } |
| | | |
| | | $jQval.unobtrusive = { |
| | | adapters: [], |
| | | |
| | | parseElement: function (element, skipAttach) { |
| | | /// <summary> |
| | | /// Parses a single HTML element for unobtrusive validation attributes. |
| | | /// </summary> |
| | | /// <param name="element" domElement="true">The HTML element to be parsed.</param> |
| | | /// <param name="skipAttach" type="Boolean">[Optional] true to skip attaching the |
| | | /// validation to the form. If parsing just this single element, you should specify true. |
| | | /// If parsing several elements, you should specify false, and manually attach the validation |
| | | /// to the form when you are finished. The default is false.</param> |
| | | var $element = $(element), |
| | | form = $element.parents("form")[0], |
| | | valInfo, rules, messages; |
| | | |
| | | if (!form) { // Cannot do client-side validation without a form |
| | | return; |
| | | } |
| | | |
| | | valInfo = validationInfo(form); |
| | | valInfo.options.rules[element.name] = rules = {}; |
| | | valInfo.options.messages[element.name] = messages = {}; |
| | | |
| | | $.each(this.adapters, function () { |
| | | var prefix = "data-val-" + this.name, |
| | | message = $element.attr(prefix), |
| | | paramValues = {}; |
| | | |
| | | if (message !== undefined) { // Compare against undefined, because an empty message is legal (and falsy) |
| | | prefix += "-"; |
| | | |
| | | $.each(this.params, function () { |
| | | paramValues[this] = $element.attr(prefix + this); |
| | | }); |
| | | |
| | | this.adapt({ |
| | | element: element, |
| | | form: form, |
| | | message: message, |
| | | params: paramValues, |
| | | rules: rules, |
| | | messages: messages |
| | | }); |
| | | } |
| | | }); |
| | | |
| | | $.extend(rules, { "__dummy__": true }); |
| | | |
| | | if (!skipAttach) { |
| | | valInfo.attachValidation(); |
| | | } |
| | | }, |
| | | |
| | | parse: function (selector) { |
| | | /// <summary> |
| | | /// Parses all the HTML elements in the specified selector. It looks for input elements decorated |
| | | /// with the [data-val=true] attribute value and enables validation according to the data-val-* |
| | | /// attribute values. |
| | | /// </summary> |
| | | /// <param name="selector" type="String">Any valid jQuery selector.</param> |
| | | |
| | | // $forms includes all forms in selector's DOM hierarchy (parent, children and self) that have at least one |
| | | // element with data-val=true |
| | | var $selector = $(selector), |
| | | $forms = $selector.parents() |
| | | .addBack() |
| | | .filter("form") |
| | | .add($selector.find("form")) |
| | | .has("[data-val=true]"); |
| | | |
| | | $selector.find("[data-val=true]").each(function () { |
| | | $jQval.unobtrusive.parseElement(this, true); |
| | | }); |
| | | |
| | | $forms.each(function () { |
| | | var info = validationInfo(this); |
| | | if (info) { |
| | | info.attachValidation(); |
| | | } |
| | | }); |
| | | } |
| | | }; |
| | | |
| | | adapters = $jQval.unobtrusive.adapters; |
| | | |
| | | adapters.add = function (adapterName, params, fn) { |
| | | /// <summary>Adds a new adapter to convert unobtrusive HTML into a jQuery Validate validation.</summary> |
| | | /// <param name="adapterName" type="String">The name of the adapter to be added. This matches the name used |
| | | /// in the data-val-nnnn HTML attribute (where nnnn is the adapter name).</param> |
| | | /// <param name="params" type="Array" optional="true">[Optional] An array of parameter names (strings) that will |
| | | /// be extracted from the data-val-nnnn-mmmm HTML attributes (where nnnn is the adapter name, and |
| | | /// mmmm is the parameter name).</param> |
| | | /// <param name="fn" type="Function">The function to call, which adapts the values from the HTML |
| | | /// attributes into jQuery Validate rules and/or messages.</param> |
| | | /// <returns type="jQuery.validator.unobtrusive.adapters" /> |
| | | if (!fn) { // Called with no params, just a function |
| | | fn = params; |
| | | params = []; |
| | | } |
| | | this.push({ name: adapterName, params: params, adapt: fn }); |
| | | return this; |
| | | }; |
| | | |
| | | adapters.addBool = function (adapterName, ruleName) { |
| | | /// <summary>Adds a new adapter to convert unobtrusive HTML into a jQuery Validate validation, where |
| | | /// the jQuery Validate validation rule has no parameter values.</summary> |
| | | /// <param name="adapterName" type="String">The name of the adapter to be added. This matches the name used |
| | | /// in the data-val-nnnn HTML attribute (where nnnn is the adapter name).</param> |
| | | /// <param name="ruleName" type="String" optional="true">[Optional] The name of the jQuery Validate rule. If not provided, the value |
| | | /// of adapterName will be used instead.</param> |
| | | /// <returns type="jQuery.validator.unobtrusive.adapters" /> |
| | | return this.add(adapterName, function (options) { |
| | | setValidationValues(options, ruleName || adapterName, true); |
| | | }); |
| | | }; |
| | | |
| | | adapters.addMinMax = function (adapterName, minRuleName, maxRuleName, minMaxRuleName, minAttribute, maxAttribute) { |
| | | /// <summary>Adds a new adapter to convert unobtrusive HTML into a jQuery Validate validation, where |
| | | /// the jQuery Validate validation has three potential rules (one for min-only, one for max-only, and |
| | | /// one for min-and-max). The HTML parameters are expected to be named -min and -max.</summary> |
| | | /// <param name="adapterName" type="String">The name of the adapter to be added. This matches the name used |
| | | /// in the data-val-nnnn HTML attribute (where nnnn is the adapter name).</param> |
| | | /// <param name="minRuleName" type="String">The name of the jQuery Validate rule to be used when you only |
| | | /// have a minimum value.</param> |
| | | /// <param name="maxRuleName" type="String">The name of the jQuery Validate rule to be used when you only |
| | | /// have a maximum value.</param> |
| | | /// <param name="minMaxRuleName" type="String">The name of the jQuery Validate rule to be used when you |
| | | /// have both a minimum and maximum value.</param> |
| | | /// <param name="minAttribute" type="String" optional="true">[Optional] The name of the HTML attribute that |
| | | /// contains the minimum value. The default is "min".</param> |
| | | /// <param name="maxAttribute" type="String" optional="true">[Optional] The name of the HTML attribute that |
| | | /// contains the maximum value. The default is "max".</param> |
| | | /// <returns type="jQuery.validator.unobtrusive.adapters" /> |
| | | return this.add(adapterName, [minAttribute || "min", maxAttribute || "max"], function (options) { |
| | | var min = options.params.min, |
| | | max = options.params.max; |
| | | |
| | | if (min && max) { |
| | | setValidationValues(options, minMaxRuleName, [min, max]); |
| | | } |
| | | else if (min) { |
| | | setValidationValues(options, minRuleName, min); |
| | | } |
| | | else if (max) { |
| | | setValidationValues(options, maxRuleName, max); |
| | | } |
| | | }); |
| | | }; |
| | | |
| | | adapters.addSingleVal = function (adapterName, attribute, ruleName) { |
| | | /// <summary>Adds a new adapter to convert unobtrusive HTML into a jQuery Validate validation, where |
| | | /// the jQuery Validate validation rule has a single value.</summary> |
| | | /// <param name="adapterName" type="String">The name of the adapter to be added. This matches the name used |
| | | /// in the data-val-nnnn HTML attribute(where nnnn is the adapter name).</param> |
| | | /// <param name="attribute" type="String">[Optional] The name of the HTML attribute that contains the value. |
| | | /// The default is "val".</param> |
| | | /// <param name="ruleName" type="String" optional="true">[Optional] The name of the jQuery Validate rule. If not provided, the value |
| | | /// of adapterName will be used instead.</param> |
| | | /// <returns type="jQuery.validator.unobtrusive.adapters" /> |
| | | return this.add(adapterName, [attribute || "val"], function (options) { |
| | | setValidationValues(options, ruleName || adapterName, options.params[attribute]); |
| | | }); |
| | | }; |
| | | |
| | | $jQval.addMethod("__dummy__", function (value, element, params) { |
| | | return true; |
| | | }); |
| | | |
| | | $jQval.addMethod("regex", function (value, element, params) { |
| | | var match; |
| | | if (this.optional(element)) { |
| | | return true; |
| | | } |
| | | |
| | | match = new RegExp(params).exec(value); |
| | | return (match && (match.index === 0) && (match[0].length === value.length)); |
| | | }); |
| | | |
| | | $jQval.addMethod("nonalphamin", function (value, element, nonalphamin) { |
| | | var match; |
| | | if (nonalphamin) { |
| | | match = value.match(/\W/g); |
| | | match = match && match.length >= nonalphamin; |
| | | } |
| | | return match; |
| | | }); |
| | | |
| | | if ($jQval.methods.extension) { |
| | | adapters.addSingleVal("accept", "mimtype"); |
| | | adapters.addSingleVal("extension", "extension"); |
| | | } else { |
| | | // for backward compatibility, when the 'extension' validation method does not exist, such as with versions |
| | | // of JQuery Validation plugin prior to 1.10, we should use the 'accept' method for |
| | | // validating the extension, and ignore mime-type validations as they are not supported. |
| | | adapters.addSingleVal("extension", "extension", "accept"); |
| | | } |
| | | |
| | | adapters.addSingleVal("regex", "pattern"); |
| | | adapters.addBool("creditcard").addBool("date").addBool("digits").addBool("email").addBool("number").addBool("url"); |
| | | adapters.addMinMax("length", "minlength", "maxlength", "rangelength").addMinMax("range", "min", "max", "range"); |
| | | adapters.addMinMax("minlength", "minlength").addMinMax("maxlength", "minlength", "maxlength"); |
| | | adapters.add("equalto", ["other"], function (options) { |
| | | var prefix = getModelPrefix(options.element.name), |
| | | other = options.params.other, |
| | | fullOtherName = appendModelPrefix(other, prefix), |
| | | element = $(options.form).find(":input").filter("[name='" + escapeAttributeValue(fullOtherName) + "']")[0]; |
| | | |
| | | setValidationValues(options, "equalTo", element); |
| | | }); |
| | | adapters.add("required", function (options) { |
| | | // jQuery Validate equates "required" with "mandatory" for checkbox elements |
| | | if (options.element.tagName.toUpperCase() !== "INPUT" || options.element.type.toUpperCase() !== "CHECKBOX") { |
| | | setValidationValues(options, "required", true); |
| | | } |
| | | }); |
| | | adapters.add("remote", ["url", "type", "additionalfields"], function (options) { |
| | | var value = { |
| | | url: options.params.url, |
| | | type: options.params.type || "GET", |
| | | data: {} |
| | | }, |
| | | prefix = getModelPrefix(options.element.name); |
| | | |
| | | $.each(splitAndTrim(options.params.additionalfields || options.element.name), function (i, fieldName) { |
| | | var paramName = appendModelPrefix(fieldName, prefix); |
| | | value.data[paramName] = function () { |
| | | var field = $(options.form).find(":input").filter("[name='" + escapeAttributeValue(paramName) + "']"); |
| | | // For checkboxes and radio buttons, only pick up values from checked fields. |
| | | if (field.is(":checkbox")) { |
| | | return field.filter(":checked").val() || field.filter(":hidden").val() || ''; |
| | | } |
| | | else if (field.is(":radio")) { |
| | | return field.filter(":checked").val() || ''; |
| | | } |
| | | return field.val(); |
| | | }; |
| | | }); |
| | | |
| | | setValidationValues(options, "remote", value); |
| | | }); |
| | | adapters.add("password", ["min", "nonalphamin", "regex"], function (options) { |
| | | if (options.params.min) { |
| | | setValidationValues(options, "minlength", options.params.min); |
| | | } |
| | | if (options.params.nonalphamin) { |
| | | setValidationValues(options, "nonalphamin", options.params.nonalphamin); |
| | | } |
| | | if (options.params.regex) { |
| | | setValidationValues(options, "regex", options.params.regex); |
| | | } |
| | | }); |
| | | adapters.add("fileextensions", ["extensions"], function (options) { |
| | | setValidationValues(options, "extension", options.params.extensions); |
| | | }); |
| | | |
| | | $(function () { |
| | | $jQval.unobtrusive.parse(document); |
| | | }); |
| | | |
| | | return $jQval.unobtrusive; |
| | | })); |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | // Unobtrusive validation support library for jQuery and jQuery Validate |
| | | // Copyright (c) .NET Foundation. All rights reserved. |
| | | // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. |
| | | // @version v3.2.11 |
| | | !function(a){"function"==typeof define&&define.amd?define("jquery.validate.unobtrusive",["jquery-validation"],a):"object"==typeof module&&module.exports?module.exports=a(require("jquery-validation")):jQuery.validator.unobtrusive=a(jQuery)}(function(a){function e(a,e,n){a.rules[e]=n,a.message&&(a.messages[e]=a.message)}function n(a){return a.replace(/^\s+|\s+$/g,"").split(/\s*,\s*/g)}function t(a){return a.replace(/([!"#$%&'()*+,.\/:;<=>?@\[\\\]^`{|}~])/g,"\\$1")}function r(a){return a.substr(0,a.lastIndexOf(".")+1)}function i(a,e){return 0===a.indexOf("*.")&&(a=a.replace("*.",e)),a}function o(e,n){var r=a(this).find("[data-valmsg-for='"+t(n[0].name)+"']"),i=r.attr("data-valmsg-replace"),o=i?a.parseJSON(i)!==!1:null;r.removeClass("field-validation-valid").addClass("field-validation-error"),e.data("unobtrusiveContainer",r),o?(r.empty(),e.removeClass("input-validation-error").appendTo(r)):e.hide()}function d(e,n){var t=a(this).find("[data-valmsg-summary=true]"),r=t.find("ul");r&&r.length&&n.errorList.length&&(r.empty(),t.addClass("validation-summary-errors").removeClass("validation-summary-valid"),a.each(n.errorList,function(){a("<li />").html(this.message).appendTo(r)}))}function s(e){var n=e.data("unobtrusiveContainer");if(n){var t=n.attr("data-valmsg-replace"),r=t?a.parseJSON(t):null;n.addClass("field-validation-valid").removeClass("field-validation-error"),e.removeData("unobtrusiveContainer"),r&&n.empty()}}function l(e){var n=a(this),t="__jquery_unobtrusive_validation_form_reset";if(!n.data(t)){n.data(t,!0);try{n.data("validator").resetForm()}finally{n.removeData(t)}n.find(".validation-summary-errors").addClass("validation-summary-valid").removeClass("validation-summary-errors"),n.find(".field-validation-error").addClass("field-validation-valid").removeClass("field-validation-error").removeData("unobtrusiveContainer").find(">*").removeData("unobtrusiveContainer")}}function u(e){var n=a(e),t=n.data(v),r=a.proxy(l,e),i=f.unobtrusive.options||{},u=function(n,t){var r=i[n];r&&a.isFunction(r)&&r.apply(e,t)};return t||(t={options:{errorClass:i.errorClass||"input-validation-error",errorElement:i.errorElement||"span",errorPlacement:function(){o.apply(e,arguments),u("errorPlacement",arguments)},invalidHandler:function(){d.apply(e,arguments),u("invalidHandler",arguments)},messages:{},rules:{},success:function(){s.apply(e,arguments),u("success",arguments)}},attachValidation:function(){n.off("reset."+v,r).on("reset."+v,r).validate(this.options)},validate:function(){return n.validate(),n.valid()}},n.data(v,t)),t}var m,f=a.validator,v="unobtrusiveValidation";return f.unobtrusive={adapters:[],parseElement:function(e,n){var t,r,i,o=a(e),d=o.parents("form")[0];d&&(t=u(d),t.options.rules[e.name]=r={},t.options.messages[e.name]=i={},a.each(this.adapters,function(){var n="data-val-"+this.name,t=o.attr(n),s={};void 0!==t&&(n+="-",a.each(this.params,function(){s[this]=o.attr(n+this)}),this.adapt({element:e,form:d,message:t,params:s,rules:r,messages:i}))}),a.extend(r,{__dummy__:!0}),n||t.attachValidation())},parse:function(e){var n=a(e),t=n.parents().addBack().filter("form").add(n.find("form")).has("[data-val=true]");n.find("[data-val=true]").each(function(){f.unobtrusive.parseElement(this,!0)}),t.each(function(){var a=u(this);a&&a.attachValidation()})}},m=f.unobtrusive.adapters,m.add=function(a,e,n){return n||(n=e,e=[]),this.push({name:a,params:e,adapt:n}),this},m.addBool=function(a,n){return this.add(a,function(t){e(t,n||a,!0)})},m.addMinMax=function(a,n,t,r,i,o){return this.add(a,[i||"min",o||"max"],function(a){var i=a.params.min,o=a.params.max;i&&o?e(a,r,[i,o]):i?e(a,n,i):o&&e(a,t,o)})},m.addSingleVal=function(a,n,t){return this.add(a,[n||"val"],function(r){e(r,t||a,r.params[n])})},f.addMethod("__dummy__",function(a,e,n){return!0}),f.addMethod("regex",function(a,e,n){var t;return!!this.optional(e)||(t=new RegExp(n).exec(a),t&&0===t.index&&t[0].length===a.length)}),f.addMethod("nonalphamin",function(a,e,n){var t;return n&&(t=a.match(/\W/g),t=t&&t.length>=n),t}),f.methods.extension?(m.addSingleVal("accept","mimtype"),m.addSingleVal("extension","extension")):m.addSingleVal("extension","extension","accept"),m.addSingleVal("regex","pattern"),m.addBool("creditcard").addBool("date").addBool("digits").addBool("email").addBool("number").addBool("url"),m.addMinMax("length","minlength","maxlength","rangelength").addMinMax("range","min","max","range"),m.addMinMax("minlength","minlength").addMinMax("maxlength","minlength","maxlength"),m.add("equalto",["other"],function(n){var o=r(n.element.name),d=n.params.other,s=i(d,o),l=a(n.form).find(":input").filter("[name='"+t(s)+"']")[0];e(n,"equalTo",l)}),m.add("required",function(a){"INPUT"===a.element.tagName.toUpperCase()&&"CHECKBOX"===a.element.type.toUpperCase()||e(a,"required",!0)}),m.add("remote",["url","type","additionalfields"],function(o){var d={url:o.params.url,type:o.params.type||"GET",data:{}},s=r(o.element.name);a.each(n(o.params.additionalfields||o.element.name),function(e,n){var r=i(n,s);d.data[r]=function(){var e=a(o.form).find(":input").filter("[name='"+t(r)+"']");return e.is(":checkbox")?e.filter(":checked").val()||e.filter(":hidden").val()||"":e.is(":radio")?e.filter(":checked").val()||"":e.val()}}),e(o,"remote",d)}),m.add("password",["min","nonalphamin","regex"],function(a){a.params.min&&e(a,"minlength",a.params.min),a.params.nonalphamin&&e(a,"nonalphamin",a.params.nonalphamin),a.params.regex&&e(a,"regex",a.params.regex)}),m.add("fileextensions",["extensions"],function(a){e(a,"extension",a.params.extensions)}),a(function(){f.unobtrusive.parse(document)}),f.unobtrusive}); |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | The MIT License (MIT) |
| | | ===================== |
| | | |
| | | Copyright Jörn Zaefferer |
| | | |
| | | Permission is hereby granted, free of charge, to any person obtaining a copy |
| | | of this software and associated documentation files (the "Software"), to deal |
| | | in the Software without restriction, including without limitation the rights |
| | | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell |
| | | copies of the Software, and to permit persons to whom the Software is |
| | | furnished to do so, subject to the following conditions: |
| | | |
| | | The above copyright notice and this permission notice shall be included in |
| | | all copies or substantial portions of the Software. |
| | | |
| | | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR |
| | | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, |
| | | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE |
| | | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER |
| | | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, |
| | | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN |
| | | THE SOFTWARE. |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | Copyright JS Foundation and other contributors, https://js.foundation/ |
| | | |
| | | This software consists of voluntary contributions made by many |
| | | individuals. For exact contribution history, see the revision history |
| | | available at https://github.com/jquery/jquery |
| | | |
| | | The following license applies to all parts of this software except as |
| | | documented below: |
| | | |
| | | ==== |
| | | |
| | | Permission is hereby granted, free of charge, to any person obtaining |
| | | a copy of this software and associated documentation files (the |
| | | "Software"), to deal in the Software without restriction, including |
| | | without limitation the rights to use, copy, modify, merge, publish, |
| | | distribute, sublicense, and/or sell copies of the Software, and to |
| | | permit persons to whom the Software is furnished to do so, subject to |
| | | the following conditions: |
| | | |
| | | The above copyright notice and this permission notice shall be |
| | | included in all copies or substantial portions of the Software. |
| | | |
| | | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, |
| | | EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF |
| | | MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND |
| | | NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE |
| | | LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION |
| | | OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION |
| | | WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. |
| | | |
| | | ==== |
| | | |
| | | All files located in the node_modules and external directories are |
| | | externally maintained libraries used by this software which have their |
| | | own licenses; we recommend you read them, as their terms may differ from |
| | | the terms above. |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | <Solution> |
| | | <Project Path="WIDESEAWCS_S7Simulator.Application/WIDESEAWCS_S7Simulator.Application.csproj" /> |
| | | <Project Path="WIDESEAWCS_S7Simulator.Core/WIDESEAWCS_S7Simulator.Core.csproj" /> |
| | | <Project Path="WIDESEAWCS_S7Simulator.Server/WIDESEAWCS_S7Simulator.Server.csproj" /> |
| | | <Project Path="WIDESEAWCS_S7Simulator.UnitTests/WIDESEAWCS_S7Simulator.UnitTests.csproj" /> |
| | | <Project Path="WIDESEAWCS_S7Simulator.Web/WIDESEAWCS_S7Simulator.Web.csproj" /> |
| | | </Solution> |