首页 > 解决方案 > 为什么我的 asp.net 模型绑定不起作用?

问题描述

我的控制器没有从我的视图中的表单接收数据。
我之前在其他模型上使用过基本完全相同的代码,并且它工作得非常好。
有人可以解释为什么这不起作用吗?

控制器:

[HttpPost]
[ValidateAntiForgeryToken]
public IActionResult ChangeWiFiNetwork(Models.Settings.NetworkSettings model)
{
    Logger.LogInformation("SSID:", model.SSID);
    Logger.LogInformation("PASS:", model.Password);
    return RedirectToAction("Index");
}

看法:

@model Webserver.Models.Settings.Settings

<h1>Settings</h1>

<div class="row">
    <div class="col-6">
        <form asp-action="ChangeWiFiNetwork">
            <div class="form-group">
                <label asp-for="Network.SSID" class="control-label"></label>
                <input asp-for="Network.SSID" class="form-control" />
                <span asp-validation-for="Network.SSID" class="text-danger"></span>
            </div>
            <div class="form-group">
                <label asp-for="Network.Password" class="control-label"></label>
                <input asp-for="Network.Password" class="form-control" />
                <span asp-validation-for="Network.Password" class="text-danger"></span>
            </div>
            <div class="form-group">
                <input type="submit" value="Save" class="btn btn-primary" />
            </div>
        </form>
    </div>
</div>

楷模:

namespace Webserver.Models.Settings
{
    public class Settings
    {
        public NetworkSettings Network { get; set; }
    }
}

namespace Webserver.Models.Settings
{
    public class NetworkSettings
    {
        public string SSID { get; set; }
        public string Password { get; set; }
    }
}

输出

SSID: 
PASS: 

两者都在调试模式下显示为 null。

Firefox 网络分析显示 Network.SSID 和 Network.Password 正在表单数据中发送。

我正在使用.Net 5

谢谢

标签: asp.netasp.net-mvcasp.net-core.net-core

解决方案


现在我将手动从 Request.Form 中提取值。

这是非常糟糕的代码,但我就是不明白为什么模型绑定不起作用。

[HttpPost]
[ValidateAntiForgeryToken]
public IActionResult ChangeWiFiNetwork(Models.Settings.NetworkSettings throwaway)
{
    if (!(Request.Form.ContainsKey("NetworkSettings.SSID") && Request.Form.ContainsKey("NetworkSettings.Password")))
    {
        throw new Exception("SSID or Password missing!");
    }

    Models.Settings.NetworkSettings settings = new()
    {
        SSID = Request.Form["NetworkSettings.SSID"],
        Password = Request.Form["NetworkSettings.Password"]
    };

    Logger.LogInformation("SSID: " + settings.SSID);
    Logger.LogInformation("PASS: " + settings.Password);

    return RedirectToAction("Index");
}

推荐阅读