[英]@Html.EditorFor targeting wrong property
我在编辑数据的地方有剃刀视图。
我的课程是这样的:
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
):
正如您所看到的,出于某种原因,razor 以某种方式具有两种属性,但一种具有null
(他在内部视图中得到),另一种具有良好的价值。
我能做什么?
您的代码有几个问题。 首先是您不能将 new CustomClass 分配给Value2
,因为它不会被 operator 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>
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.