asp.net - 为什么我的 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
谢谢
解决方案
现在我将手动从 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");
}
推荐阅读
- ethereum - 为什么我的 truffle 部署由于资金不足而失败?
- alpine.js - 如何对两个数字求和并在 alpine JS 的第三个框中显示结果?
- linux - ModuleNotFoundError:没有名为“cv2”的模块,linux
- node.js - 如何使节点 js 和 npm 从另一个 docker 容器可见?
- php - symfony 5 上的搜索机制
- reactjs - 如何将数据传递给父组件 React Native
- android - 如何在高度约束文本小部件中获取字符串的最后一个合适的单词?
- vue.js - 在 Vue 模板中存储对象
- android - ADB 无法在 Android 11 上启动 IMAGE_CAPTURE 意图活动
- datetime - x 轴上的日期 - OCTAVE