c# - @Html.EditorFor 定位错误的属性
问题描述
我在编辑数据的地方有剃刀视图。
我的课程是这样的:
public class A
{
public string Value1 { get; set; }
public int Value2 { get; set; }
public A()
{
Value1 = "First";
Value2 = 2;
}
}
public class B : A
{
public int Value3 { get; set; }
public new CustomClass Value1 { get; set; }
public B()
{
Value3 = 3;
Value2 = new CustomClass();
}
}
现在当我打电话给我时,我Razor View
用这个来称呼它:
public IActionResult Edit()
{
return View(new B());
}
在我的cshtml
代码中,我有这样的设置:
@using (Html.BeginForm("Apply", "MyController", FormMethod.Post))
{
@Html.HiddenFor(x => x.Value1);
<label>Change value 3</label>
@Html.EditorFor(x => x.Value3);
<button class="button1">Apply!</button>
}
现在由于某种原因,当我应用更改时,它们确实应用但Value1
参数错误。
我检查了代码的入口,我看到Value1
有很好的价值,检查了/MyController/Apply
代码,它的值为 null。
当我在里面设置断点cshtml
以查看哪个值@HiddenFor(x => x.Value1)
我看到了一些奇怪的东西时,就是这样(图像中的标记属性如Value2
上面的代码所示):
因此,正如您所看到的,由于某种原因,剃刀不知何故同时具有这两种属性,但一种具有null
(他在内部视图中)和一种具有良好的价值。
我能做些什么?
解决方案
您的代码有几个问题。第一个是您不能将新的 CustomClass 分配给Value2
,因为它没有被运算符覆盖new
(与您使用 的方式相同Value1
)。
另一个是您必须在 Razor 页面 (cshtml) 的顶部包含您的视图模型@model <PathToViewModel>.B
,然后才能开始使用它。
有工作示例:
查看模型
public class A
{
public string Value1 { get; set; }
public int Value2 { get; set; }
public A()
{
Value1 = "First";
Value2 = 2;
}
}
public class B : A
{
public int Value3 { get; set; }
// This line overriding Value1 from the parent class A, so you can now assign it to a boolean (or CustomClass) value
public new bool Value1 { get; set; }
public B()
{
Value3 = 3;
// Value2 = new CustomClass(); //Error since Value2 is declared to integer in the parent class
// What you can do is to assign Value2 to a new integer value
Value2 = 8;
}
}
剃刀页面
@model Web.ViewModels.Account.B
@using (Html.BeginForm("MyAction", "MyController", FormMethod.Post))
{
@Html.HiddenFor(x => x.Value1);
<p>Value 1: @Model.Value1</p> // prints: False
<p>Value 2: @Model.Value2</p> // prints: 8
<p>Value 2: @Model.Value3</p> // prints: 3
<label>Change value 3</label>
@Html.EditorFor(x => x.Value3);
<button class="button1">Apply!</button>
}
控制器中的操作是正确的。
发布动作:
我还鼓励您使用标签助手而不是 HTML 助手,如果您使用的是 .NET Core,可以在此处阅读有关它的更多信息。下面是一个使用标签助手编写的类似示例。
@model Web.ViewModels.Account.B
<form asp-controller="MyController" asp-action="MyAction" method="post">
<input type="hidden" asp-for="Value1" />
<label asp-for="Value3">Change value 3</label>
<input asp-for="Value3" />
<button class="button1">Apply!</button>
</form>
推荐阅读
- node.js - 如何修复 travis-ci 中的以下构建错误:FATAL ERROR: CALL_AND_RETRY_LAST Allocation failed - JavaScript heap out of memory
- r - tsv 文件的多次导入仅适用于第一个文件
- smtp - 无法让 Haraka 使用 LetsEncrypt 证书
- google-apps-script - 基于单元格值自动生成的电子邮件
- swift - 当 JSON 的名称中包含带有“-”的字符串时,如何使用 Decodable 解析 JSON
- java - Java 错误打开注册表项“软件\JavaSoft\Java 运行时环境”
- jquery - 有什么方法可以在我单击图像时显示切换菜单?
- parsing - 评估解析的复杂性以及从哪些参数发布工作成本的标准是什么?
- flutter - 有没有办法将 CustomPainter 的 Path 和 Paint 存储在颤动中?
- android-studio - 如何修复 OpenCV 在 Android Studio 中的导入错误?