У меня проблемы с возвратом модели с помощью формы.
Проблема в том, что когда я отправляю форму, значения равны нулю, хотя я указал, что возвращает модель
это мой контроллер
И это мой вид, который возвращает ноль.
@model MyEnglishDictionary.Models.Dictionary
@{
ViewData["Title"] = "Create";
}
<h2>Create</h2>
<form method = "post" asp-action = "Create">
<div class = "p-4 border rounded">
<div asp-validation-summary = "ModelOnly" class = "text-danger"></div>
<div class = "form-group row">
<div class = "col-2">
<label asp-for = "Word"></label>
</div>
<div class = "col-5">
<input asp-for = "Word" class = "form-control" />
</div>
<span asp-validation-for = "Word" class = "text-danger"></span>
</div>
<div class = "form-group row">
<div class = "col-2">
<label asp-for = "Meaning"></label>
</div>
<div class = "col-5">
<input asp-for = "Meaning" class = "form-control" />
</div>
<span asp-validation-for = "Meaning" class = "text-danger"></span>
</div>
<div class = "form-group row">
<div class = "col-2">
<label asp-for = "Pronunciation"></label>
</div>
<div class = "col-5">
<input asp-for = "Pronunciation" class = "form-control" />
</div>
<span asp-validation-for = "Pronunciation" class = "text-danger"></span>
</div>
<br />
<div class = "form-group">
<input type = "submit" class = "btn btn-primary" value = "Create" />
<a asp-action = "Index" class = "btn btn-success">Back To List</a>
</div>
</div>
</form>
@section Scripts{
@{ await Html.RenderPartialAsync("_ValidationScriptsPartial"); }
}
РЕДАКТИРОВАТЬ
Это мой контроллер словаря.
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Mvc;
using MyEnglishDictionary.Data;
using MyEnglishDictionary.Models;
namespace MyEnglishDictionary.Controllers
{
public class DictionaryController : Controller
{
private readonly ApplicationDbContext _db;
public DictionaryController(ApplicationDbContext db)
{
_db = db;
}
public IActionResult Index()
{
return View(_db.Dictionaries.ToList());
}
public IActionResult Create()
{
return View();
}
[HttpPost]
[ValidateAntiForgeryToken]
public async Task<IActionResult> Create(Models.Dictionary word)
{
if (!ModelState.IsValid)
{
return View(word);
}
_db.Add(word);
await _db.SaveChangesAsync();
return RedirectToAction(nameof(Index));
}
}
}
А это моя модель словаря
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
namespace MyEnglishDictionary.Models
{
public class Dictionary
{
[Key]
public int Id { get; set; }
[Required]
public string Word { get; set; }
[Required]
public string Meaning { get; set; }
[Required]
public string Pronunciation { get; set; }
public string Link { get; set; }
public DateTime Date { get; set; }
}
}
Я использую Net Core 2.1, но у меня есть несколько проектов, которые я использую таким же образом для передачи модели формы из представления в контроллер, и они работают.
Где ваш метод @Html.AntiForgeryToken()?
@FatikhanGasimov с Asp.Net Core 2 или более поздней версии тег формы автоматически вставит токен защиты от подделки в элементы формы html, см. документацию здесь
Вы должны опубликовать код своего контроллера в ответе вместо скриншотов, это намного сложнее для людей, пытающихся вам помочь.
Не могли бы вы добавить свой Dictionary класс?
Есть моя Модель и полный Контроллер
@LazZiya Я установил свойство привязки [Key] к идентификатору, а [Required] к слову и значению, но все равно не работает :(





Вы должны привязать свойства к вашей модели. В твоем случае:
public async Task<IActionResult> Create([Bind("Word, Meaning, Pronounciation")] Dictionary word)
Дальнейшее чтение: Привязка модели
с .Net Core вам не нужно добавлять @Html.AntiForgeryToken(), потому что он будет автоматически внедрен в тег формы, см. документация для получения более подробной информации.
@LazZiya Спасибо, не знал.
Нужно обратить внимание на название параметра и полей.
Для вашей проблемы это вызвано тем, что вы определили поле Word и параметр word, что привело к сбою привязки.
Попробуйте заменить public async Task<IActionResult> Create(Models.Dictionary word) на public async Task<IActionResult> Create(Models.Dictionary dictionary).
измените имя параметра word на что-то другое, например _word, похоже, что компилятор не принимает его в качестве имени параметра в С#.
public async Task<IActionResult> Create(Models.Dictionary _word)
{
if (!ModelState.IsValid)
{
return View(_word);
}
_db.Add(_word);
await _db.SaveChangesAsync();
return RedirectToAction(nameof(Index));
}
кстати, я не видел его в зарезервированных ключевых словах список
возможно, вы не добавили атрибут привязки к своей модели
[BindProperty], можете ли вы разместить свой контроллер в вопросе не как на картинке.