Zbudowuję prostą stronę internetową z ASP.NET Core 3.1 w celu reprodukcji problemu. Istnieją 2 działanie w tym samym HomeController.cs.

Jeden do renderowania formularza HTML, inny do odbierania danych formularza, a następnie formularz renderowania ponownie.

public class HomeController : Controller
{
        // rendering form
        [HttpGet]
        public IActionResult Index()
        {
            var myForm = new MyForm();
            myForm.Id = 100;
            return View("index", myForm);
        }

        // after form post, rendering form with updated value.
        [HttpPost]
        public IActionResult Index(MyForm m)
        {
            m.Id = 200;
            return View("index", m);
        }
}

Używam ASP. Net Core Tag Helper w index.cshtml

@model MyForm

<div>
    <form asp-controller="Home" asp-action="Index" method="post">
        <span>@Model.Id</span>
        <input type="text" asp-for="@Model.Id"/>
        <button type="submit">Submit</button>
    </form>
</div>

Kiedy dostaję / wskaźnik, wszystko jest w porządku, zarówno @ model.Id w zakresie zakresu, jak i wartości wejściowej wynosi 100

Odpowiedź http na get / indeks

<form method="post" action="/">
        <span>100</span>
        <input type="text" data-val="true" 
               data-val-required="The Id field is required."
               id="Id" name="Id" value="100">
        <button type="submit">Submit</button>
</form>

Ale kiedy publikuję formularz, spodziewałem się, że zarówno wartość w zakresie, jak i wejściu powinna wynosić 200, ale jest 200 w zakresie i 100 w formie

Odpowiedź HTTP na pocztę / indeks z 100 na wejściu

<form method="post" action="/">
        <span>200</span>
        <input type="text" data-val="true" 
               data-val-required="The Id field is required."
               id="Id" name="Id" value="100">
        <button type="submit">Submit</button>
</form>

Myślę, że "ASP-for" zdecyduje się odczytać dane z oryginalnego Modelestate, który jest zbudowany podczas modelu ModelBinding. Zamiast odczytu Viewmodel przekazywany do renderowania brzytwy widoku.

Czy ktoś wie, dlaczego tag Helper asp-for Tak w ten sposób? Jak można uniknąć tego zachowania i wykonać {X1}} Użyj modelu, który przekazałem w widoku ("indeks", m)

0
Opass 21 październik 2020, 21:35

1 odpowiedź

Najlepsza odpowiedź

Myślę, że "ASP-for" zdecyduje się odczytać dane z oryginalnego Modelestate

Tak, to jest projekt. Domyślny wyświetlacz Taghelper Wartość Modelestate Nie model.

Jeśli chcesz asp-for wyświetlić zaktualizowaną wartość modelu, możesz dodać ModelState.Clear(); w akcji pocztowej.

public IActionResult Index(MyForm m)
{
    ModelState.Clear();
    m.Id = 200;
    return View("index", m);
}
1
mj1313 22 październik 2020, 07:14