2016-06-09 3 views
1

Я использую ASP.NET Core RC2 MVC с платформой Entity Framework и пытаюсь сохранить новый автомобиль. Проблема в том, что в методе создания автомобильного контроллера свойство Цвет: null, когда действие отправлено назад. Все остальные свойства/поля установлены. Но цвет, который относится к модели CarColors, равен нулю.Связывание свойств модели MVC Core MVC null

CarColor модель

public class CarColor 
{ 
    [Key] 
    public int CarColorId { get; set; } 

    [MinLength(3)] 
    public string Name { get; set; } 

    [Required] 
    public string ColorCode { get; set; } 
} 

Основная модель автомобиля

public class Car 
{ 
    [Key] 
    public int CarId { get; set; } 

    [MinLength(2)] 
    public string Name { get; set; } 

    [Required] 
    public DateTime YearOfConstruction { get; set; } 

    [Required] 
    public CarColor Color { get; set; } 
} 

Автомобили, контроллер

[HttpPost] 
[ValidateAntiForgeryToken] 
public async Task<IActionResult> Create([Bind("Color,Name,YearOfConstruction")] Car car) 
{ 
    if (ModelState.IsValid) 
    { 
     _context.Add(car); 
     await _context.SaveChangesAsync(); 
     return RedirectToAction("Index"); 
    } 
    return View(car); 
} 

Запрос данных:

post request data

скриншот Отладка публикуемую автомобиля

debugging screenshot

Может у меня руку помощи, как собственность может быть «привязан», и поэтому ModelState.IsValid == истинный?

+1

Могли бы вы с как нам запрос? –

+0

Несмотря на ASP.NET 5, это может помочь https://lbadri.wordpress.com/2014/11/23/web-api-model-binding-in-asp-net-mvc-6-asp-net-5/ – Set

+0

Добавлен скриншот с данными запроса сообщения. –

ответ

1

Если вы хотите заполнить свойство цвета вашей модели автомобиля, ваш запрос должен выглядеть так:

[0] {[Name, Volvo]} 
[1] {[Yearof Construction, 19/16/2015]} 
[2] {[Color.CarColorId, 3]} (will be "bound" only ID) 

Это означает: имя вашего ввода/выбор на View должен быть «Color.CarColorId».

... Но вы выбрали неправильный путь. Вы не должны напрямую использовать модели домена в своем представлении. Вам следует создать специальные модели для View и для входящих свойств ваших методов действий.

правильные модели путь

домена (без изменений):

public class CarColor 
{ 
    [Key] 
    public int CarColorId { get; set; } 

    [MinLength(3)] 
    public string Name { get; set; } 

    [Required] 
    public string ColorCode { get; set; } 
} 

public class Car 
{ 
    [Key] 
    public int CarId { get; set; } 

    [MinLength(2)] 
    public string Name { get; set; } 

    [Required] 
    public DateTime YearOfConstruction { get; set; } 

    [Required] 
    public CarColor Color { get; set; } 
} 

Вид модели:

public class CarModel 
{  
    [MinLength(2)] 
    public string Name { get; set; } 

    [Required] 
    public DateTime YearOfConstruction { get; set; } 

    [Required] 
    public int ColorId { get; set; }  
} 

Контроллер:

[HttpPost] 
[ValidateAntiForgeryToken] 
public async Task<IActionResult> Create(CarModel model) 
{ 
    if (ModelState.IsValid) 
    { 
     var color = await _context.Colors.FirstAsync(c => c.CarColorId == model.ColorId, this.HttpContext.RequestAborted); 
     var car = new Car(); 
     car.Name = model.Name; 
     car.YearOfConstruction = model.YearOfConstruction; 
     car.Color = color; 

     _context.Cars.Add(car); 
     await _context.SaveChangesAsync(this.HttpContext.RequestAborted); 
     return RedirectToAction("Index"); 
    } 
    return View(car); 
} 
+0

Спасибо за подробную информацию! Работает как шарм. –

+0

Таким образом, при использовании ViewModel мы не можем использовать: '[Bind (« Цвет, имя, годOfConstruction »)]' с параметром в функции сохранения контроллера? – OmarBizreh

Смежные вопросы