2
votes

Voir le formulaire de publication return null?

J'ai des problèmes pour renvoyer un modèle en utilisant un formulaire.

Le problème est que lorsque je soumets le formulaire, les valeurs sont nulles même si j'ai spécifié que renvoie un modèle

C'est mon contrôleur

 https://i.stack.imgur.com/7P5uY.png

Et c'est ma vue qui renvoie null. p>

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; }
    }
}

MODIFIER

Ceci est mon contrôleur de dictionnaire.

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));
        }
    }
}

Et ceci est mon modèle de dictionnaire

@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"); }
}

J'utilise Net Core 2.1, mais j'ai quelques projets que j'utilise de la même manière pour passer le modèle de formulaire de View au contrôleur et ils travail.


7 commentaires

Vous n'avez probablement pas ajouté d'attribut de liaison à votre modèle [BindProperty] , pouvez-vous publier votre contrôleur dans la question et non comme une image.


Où est votre méthode @ Html.AntiForgeryToken ()?


@FatikhanGasimov avec Asp.Net Core 2 ou version ultérieure, la balise form injectera automatiquement un jeton anti-contrefaçon dans les éléments de formulaire html, voir la documentation ici


Vous devriez publier le code de votre contrôleur dans la réponse au lieu de captures d'écran, c'est beaucoup plus difficile pour les personnes qui essaient de vous aider


Pourriez-vous ajouter votre classe Dictionary ?


Il y a mon modèle et le contrôleur complet


@LazZiya J'ai défini la propriété de liaison de [Key] sur Id et [Requis] sur mot et signification et ne fonctionne toujours pas :(


3 Réponses :


0
votes

Vous devez lier les propriétés à votre modèle. Dans votre cas:

public async Task<IActionResult> Create([Bind("Word, Meaning, Pronounciation")] Dictionary word)

Lectures complémentaires: Liaison de modèle


2 commentaires

avec .Net Core vous n'avez pas besoin d'ajouter @ Html.AntiForgeryToken () car il sera injecté automatiquement dans la balise form voir documentation pour plus de détails


@LazZiya Merci, je ne le savais pas.



1
votes

Vous devez faire attention au nom du paramètre et des champs.

Pour votre problème, cela est dû au fait que vous avez défini un champ qui est Word et le paramètre est mot qui a provoqué l'échec de la liaison.

Essayez de changer la tâche asynchrone publique Create (Models.Dictionary word) en public async Task Create (Models.Dictionary dictionary) . < / p>


0 commentaires

1
votes

changez le nom du paramètre word en quelque chose d'autre comme _word , il semble que le compilateur ne l'accepte pas comme nom de paramètre dans c #.

public async Task<IActionResult> Create(Models.Dictionary _word)
{
    if(!ModelState.IsValid)
    {
        return View(_word);
    }

    _db.Add(_word);
    await _db.SaveChangesAsync();

    return RedirectToAction(nameof(Index));
}


0 commentaires