Почему моя привязка данных не работает и всегда нулевая? - PullRequest
0 голосов
/ 03 июля 2019

Я пытаюсь добавить данные в базу данных. Я экспериментировал с Blazor и .NET core:

Это мой код в контроллере:

 [Route("AddCarBlazor")]
 [HttpPost]
        public IActionResult PostBlazor(Car car)
        {
            if (car.CarId == 0)
            {
                // New
                car.Created = DateTime.Now;
                _context.Cars.Add(car);
                _context.SaveChanges();
                return Ok();
            }
            else
            {
                // Update
                var c = _context.Cars.First(e => e.CarId == car.CarId);
                c.Brand = car.Brand;
                c.Color = car.Color;
                c.Model = car.Model;
                c.LastChange = DateTime.Now;
                c.TopSpeed = car.TopSpeed;
                _context.SaveChanges();
                return Ok();
            }
        }

Моя машина модель выглядит так:

public class Car
    {
        [Key]
        public long CarId { get; set; }
        public string Created { get; set; }
        public string LastChange { get; set; }
        public string Brand { get; set; }
        public string Model { get; set; }
        public string Color { get; set; }
        public long TopSpeed { get; set; }
    }

Я называю этот метод так:

  private async Task AddCar()
    {
        await Http.PostJsonAsync(baseUrl + "/AddCarBlazor/", carobject);
        await Refresh();
    }

Когда я заполняю форму и нажимаю кнопку add , объект car всегда null

Это моя форма с привязкой к данным:

<form>
    <div class="row">
        <div class="form-group col-sm-3">
            <label>Brand</label>
            <input input type="text" @bind="@carobject.Brand" class="form-control" placeholder="Enter brand" />
        </div>
    </div>
    <div class="row">
        <div class="form-group col-sm-3">
            <label>Model</label>
            <input type="text" @bind="@carobject.Model" class="form-control" placeholder="Enter model" />
        </div>
    </div>
    <div class="row">
        <div class="form-group col-sm-3">
            <label>Color</label>
            <input type="text" @bind="@carobject.Color" class="form-control" placeholder="Enter color" />
        </div>
    </div>
    <div class="row">
        <div class="form-group col-sm-3">
            <label>TopSpeed</label>
            <input type="number" @bind="@carobject.TopSpeed" class="form-control" placeholder="Enter speed" />
        </div>
    </div>
    <div class="btn-group mr-2">
        <button class="btn btn-danger mr-1" onclick=@AddCar>Save changes</button>       
    </div>
</form>

Я поставил точку останова на метод addCar . Я получаю значения из полей, но когда он попадает в контроллер, он становится null .

У меня есть следующий урок:

https://docs.microsoft.com/en-us/aspnet/core/blazor/call-web-api?view=aspnetcore-3.0

Как сохранить значения из полей и отправить их в базу данных?

Ответы [ 2 ]

1 голос
/ 04 июля 2019

Я тестирую демо, которое работает хорошо, вы можете обратиться к моему коду ниже:

1.Car.cs (пространство имен Blazor.Models)

public class Car
{

    public long CarId { get; set; }       
    public string Brand { get; set; }
    public string Model { get; set; }

}

2. AddCar.razor

@page "/car"

@using System.Net.Http
@inject HttpClient Http
@using Blazor.Models

<Editform Model="carobject">
    <div class="row">
        <div class="form-group col-sm-3">
            <label>Brand</label>
            <input   @bind="@carobject.Brand" class="form-control" placeholder="Enter brand" />
        </div>
    </div>
    <div class="row">
        <div class="form-group col-sm-3">
            <label>Model</label>
            <input  @bind="@carobject.Model" class="form-control" placeholder="Enter model" />
        </div>
    </div>

    <div class="btn-group mr-2">
        <button class="btn btn-danger mr-1" onclick="@AddCar">Save changes</button>
    </div>
</Editform>

@functions {


[Parameter]
private Car carobject { get; set; } = new Car();

private async Task AddCar()
{       
    await Http.PostJsonAsync(baseUrl + "/AddCarBlazor/", carobject);
    //await Refresh();

}
}

3.Web Конфигурация API CORS:

 app.UseCors(corsbuilder => {
            corsbuilder.AllowAnyHeader().AllowAnyMethod().AllowAnyOrigin();
        });

 app.UseHttpsRedirection();
 app.UseAuthentication();
 app.UseMvc();

4.action:

[Route("AddCarBlazor")]
[HttpPost]
public IActionResult PostBlazor([FromBody]Car car)
0 голосов
/ 08 июля 2019

После уик-энда у меня есть решение!

Я изменил свой метод в CarService.cs следующим образом:

public async Task AddCar(Car car)
{
        var client = new HttpClient { BaseAddress = new Uri("https://localhost:44369/api/car/") };
        await client.SendJsonAsync(HttpMethod.Post, "AddCar", car);
}

Затем я вызываю этометод в моей странице бритвы как это:

async Task AddCar()
{
    await CarService.AddCar(car);
    car = new CarService.Car();
    await LoadCarData();
}

Я также сделал новый объект службы, как это:

CarService.Car car = new CarService.Car();

И я переместил модель Car.cs в CarService.cs

...