首页 > 解决方案 > @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(他在内部视图中)和一种具有良好的价值。

我能做些什么?

标签: c#asp.netasp.net-corerazorrazor-pages

解决方案


您的代码有几个问题。第一个是您不能将新的 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>

推荐阅读