繁体   English   中英

@Html.EditorFor 定位错误的属性

[英]@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>

我得到了预期的回应。 我正在使用.Net 4.6 MVC。 您的 POST 操作是什么样的? 在此处输入图像描述

 [HttpPost]
    public ActionResult Apply(B b)
    {
        ViewBag.Message = "Your application description page.";

        return View();
    }

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM