WetterApp mit HTML, Css und C# über Blazor Server App?
Hallo undzwar bin ich neu in C# und möchte über die Blazor Server App eine Wetter-App programmieren, allerdings fehlt mir dazu noch der Code, da ich nicht weiß wie ich anfangen soll. Ich möchte dass mein "SearchIcon" welcher in HTML hinterlegt ist als suchbutton fungiert, damit ich die Städte suchen kann und über API möchte ich, dass mir dann die jeweiligen Temperaturen angegeben werden. Kann mir wer helfen und gegebenenfalls einen Code dafür geben.
Hier mein HTML code:
<body class="backgroundimage">
<div class="card">
<div class="search">
<button><img src="/images/SuchIcon.png"></button>
<input type="text" placeholder="Search" spellcheck="false"/>
</div>
</div>
<div class="weather">
<div class="center margin-top">
<img src="images/image1.png" width="200" height="200" style="opacity: 1" class="weather-icon" />
</div>
<div>
<h1 class="temp">22°c</h1>
</div>
<div class="center">
<h2 class="city center margin-top">New York</h2>
</div>
<hr class="hr1 line1" />
<div id="imagesMain">
<img src="/images/image1.png" width="75" height="75" class="imageline "
<img src="/images/image1.png" width="75" height="75" class="imageline "
<img src="/images/image1.png" width="75" height="75" class="imageline " style="margin-left: 5px; margin-right: -5px;"
<img src="/images/image1.png" width="75" height="75" class="imageline " style="margin-left: 22px; margin-right: -5px;"
<img src="/images/image1.png" width="75" height="75" class="imageline " style="margin-left: 5px; margin-right: -14px;"
</div>
<div>
<p style="color:black;"class="line0 title margin-left ">Monday</p>
<p style="color:black;"class="line0 title margin-left ">Tuesday</p>
<p style="color:black;"class="line0 title margin-left ">Wednesday</p>
<p style="color:black;"class="line0 title margin-left ">Thursday</p>
<p style="color: black;"class="line0 title margin-left ">Friday</p>
</div>
<hr class="hr1 line" />
<div class ="details">
<div class="col">
<img src="images/humidity.png"/>
<div>
<p class="speed">Humidity</p>
<p class="humidity">50%</p>
</div>
</div>
<div class="col">
<img src="images/wind.png" />
<div>
<p class="speed">Wind Speed</p>
<p class="wind">15 km/h </p>
</div>
</div>
</div>
</div>
</body>
hier mein Css code:
.backgroundimage {
background-image: url('../images/sun_background.png');
background-attachment: fixed;
background-repeat: no-repeat;
background-size: cover;
}
.cloud-background {
background-image: url('../images/cloud.png');
/* Füge hier die gewünschten Hintergrundbilderigenschaften hinzu */
}
.card {
width: 90%;
max-width: 470px;
color: #fff;
margin: 10px auto 0;
border-radius: 20px;
}
.search{
width: 100%;
display: flex;
align-items: center;
justify-content: space-between;
}
.search input{
border: 0;
outline: 0;
background: #ebfffc;
color: #555;
padding: 10px 25px;
height: 60px;
border-radius: 30px;
flex: 1;
margin-right: 16px;
font-size: 18px;
}
.search button{
border: 0;
outline: 0;
background: #ebfffc;
border-radius: 60%;
width: 60px;
height: 60px;
cursor: pointer;
}
.weather-icon{
margin-bottom: -30px;
}
.weather h1 {
font-size: 80px;
font-weight: 500;
color: floralwhite;
}
.weather h2 {
font-size: 40px;
font-weight: 400;
margin-top: -10px;
color: floralwhite;
}
.details {
display: flex;
align-items: center;
justify-content: space-between;
padding: 0 20px;
margin-top: 50px;
}
.col {
display: flex;
align-items: center;
text-align: left;
margin-top: 150px;
}
.col img {
width: 20px;
margin-right: 20px;
margin-bottom: 70px
}
.humidity, .wind{
font-size: 28px;
margin-top: -6px;
color: floralwhite;
}
.speed{
font-weight: bold;
}
.temp {
margin-bottom: 20px;
display: flex;
justify-content: center;
}
.search button img{
width: 55%;
}
.center {
display: flex;
justify-content: center;
}
.top-left{
display: flex;
justify-content:left
}
.top-left
{
margin-left: 10px;
}
.margin-top{
margin-top: 20px;
}
.hr1 {
width: 390px;
height: 2px;
color: black;
}
.line{
margin-bottom: -100px;
margin-top: 10px;
}
.line1{
margin-top: 30px;
margin-bottom: -20px;
}
.line0{
margin-top: 70px;
margin-bottom: -90px;
font-size: 14px;
font-weight: bold;
color: black;
}
.imageline {
margin-top: 5px;
margin-bottom: -90px;
}
.imagesMain {
padding: 0;
margin-left: auto;
margin-right: auto;
margin-top: 20px;
text-align: center;
}
.imagesMain img {
height: 400px;
width: 300px;
vertical-align: middle;
}
.title {
display: inline-block;
color: lightgray;
}
.margin-left{
margin-left: 14px;
}
1 Antwort
Sofern du mit ASP.NET/Blazor noch nicht vertraut bist, wäre es sinnvoll, wenn du dich erst einmal mit den Grundlagen dazu beschäftigst. Auf der Microsoft Learn-Plattform gibt es Tutorials zu dem Thema.
Bezüglich des Programmaufbaus wäre eine Service-Klasse nützlich, die die Anfragen an die Wetter-API durchführt.
public interface IWeatherService
{
/* weather request methods like getTemperature or similar ... */
}
public class WeatherService : IWeatherService
{
private readonly HttpClient _client;
public WeatherService(HttpClient client)
{
_client = client;
}
/* implement interface ... */
}
In der Startup-Klasse wird der Service registriert:
public void ConfigureServices(IServiceCollection services)
{
services.AddRazorPages();
services.AddServerSideBlazor();
services.AddHttpClient<IWeatherService, WeatherService>(client =>
{
// setup HTTP client (API base URL or similar) ...
});
}
Anschließend kannst du ihn innerhalb einer Blazor-Komponente nutzen.
public class WeatherData : ComponentBase
{
[Inject]
public IWeatherService WeatherService { get; set; }
/* ... */
}
Beschäftige dich in dem Zusammenhang noch, wie man mit Blazor Formulare handhabt, immerhin musst du ja noch die Daten vom Browser empfangen und dann verarbeiten.
Hinsichtlich deines HTML-Codes solltest du übrigens noch ein paar Fehler beachten/korrigieren:
- Mehrere deiner img-Tags sind unvollständig. Die schließende spitze Klammer fehlt.
- Deinen img-Elementen fehlt in jedem Fall ein alt-Attribut. Wenn alle Bilder nur dekorativer Natur sind, bleibt der Attributwert leer. Andernfalls ist dieser Guide hilfreich, um zu entscheiden, was im Attributwert stehen sollte. Bei deinem Button mit Bild würde sich übrigens ein image-input gut eignen. In jedem Fall sollte ein alt-Attribut ergänzt werden, in dem die Funktion des Buttons beschrieben wird (Bsp.: Start search).
- Bei den Paragraphen für die einzelnen Wochentage fehlt jeweils ein Leerzeichen zwischen den Attributen style und class. Da der Inline-Style stets denselben Style umsetzt, würde ich empfehlen, stattdessen einen Klassenselektor anzulegen, der die Farbe setzt.
Wie ich schon schrieb: Beschäftige dich erst mit den Blazor-Grundlagen, denn ohne sie kannst du kaum weiterarbeiten und wirst auch den oben beschriebenen Lösungsweg nicht verstehen.
(...) Bei dem SuchIcon kommt irgendwie immer ein Bild raus wenn ich draufklicke, (...)
Laut deinem JavaScript-Code schickst du bei Klick auf den Button einen API-Request und setzt im Anschluss Texte (für Stadt, Temperatur, etc.) und ein Bild. Mehr lässt sich dazu kaum sagen. Für deine Aufgabe ist es aber eh relevant, denn bei Nutzung von Blazor ist der JavaScript-Code nicht mehr nötig.
Für die App wurd mir vorgegeben aber C# zu verwenden und nicht JavaScript.
Du brauchst eine Razor Page mit einer Formularkomponente (s.o.). Die API-Requests werden in der Service-Klasse implementiert (je API-Request eine Methode).
Beispiel für deine Anfrage (basierend auf meinem Beispiel von oben):
// IWeatherService
Task<CityWeather> GetWeatherForCity(string city);
// WeatherService
private const string ApiKey = "API Key ...";
public async Task<CityWeather> GetWeatherForCity(string city)
{
var response = await _client.GetAsync($"?city={city}&appid={ApiKey}");
if (!response.IsSuccessStatusCode)
{
// some error handling ...
}
else
{
var content = await response.Content.ReadAsStringAsync();
var weather = JsonConvert.DeserializeObject<CityWeather>(content);
return weather;
}
}
Beim Aufbau der API-URL habe ich etwas geraten. Die BaseAdress (also der Stammteil der API-URL, der sich auch bei unterschiedlichen Anfragen an die API nie ändert) kannst du übrigens schon bei der Serviceregistration für den HttpClient setzen.
Das Ergebnis (JSON) kann auf eine Modelklasse gemappt werden, die in meinem Beispiel CityWeather heißt. Sie bildet also die Struktur des JSON ab.
public class CityWeather
{
[JsonProperty("name")]
public string Name { get; set; }
[JsonProperty("main")]
public WeatherData Main { get; set; }
[JsonProperty("wind")]
public Wind Wind { get; set; }
}
public class WeatherData
{
[JsonProperty("humidity")]
public double Humidity { get; set; }
[JsonProperty("temp")]
public double Temperature { get; set; }
}
public class Speed
{
[JsonProperty("speed")]
public double Speed { get; set; }
}
Für die JSON-Verarbeitung (Mapping, Deserialisierung, etc.) verwende ich Newtonsoft.Json. Diese Bibliothek kann in Visual Studio via NuGet installiert werden.
Hallo wirklich vielen Dank für deine Zeit und für deine großartige Hilfe! Ich werde mir die Tage die Basics anschauen, habe mir da etwas vorgenommen und habe leider nicht mehr soviel Zeit um es zu beenden weshalb ich das Projekt erst zu Ende bringen muss. Tut mir leid wenn ich deine Zeit in Anspruch nehme, aber kannst du mir verraten wo der code dafür ist, dass ich den "SearchIcon"-Button als such funktion programmiere?
Hallo, vielen Dank für die ausführliche Hilfe, ich bin noch nicht mit Blazor ganz vertraut, allerdings soll ich bis Dienstag die App zumindest die Logic fertig haben. Ich verstehe auch nicht ganz was du oben gemacht hast. Könntest du mir eventuell helfen damit das alles funktioniert. Bei dem SuchIcon kommt irgendwie immer ein Bild raus wenn ich draufklicke, aber ich möchte das es als Suchbutton fungiert. Außerdem weiß ich nicht ganz wie ich das mit der API mache. mit JavaScript habe ich es hinbekommen, aber für C# fehlt mir dazu noch das wissen. Für die App wurd mir vorgegeben aber C# zu verwenden und nicht JavaScript. Ich kann hier mal meinen JavaScript code rein schicken vielleicht weißt du was ich haben möchte. Danke für die Tipps nochmal!