textarea asp-for 不显示属性

B.P*_*kin 6 c# asp.net-core-mvc asp.net-core asp.net-core-2.0

我一直在从事一个小型学校项目,并决定第一次使用.net core (MVC)。我有一个小按钮,可以单击它在后台执行“ipconfig”命令并​​在文本区域中显示输出。起初我的团队伙伴只使用了

public string Result;
Run Code Online (Sandbox Code Playgroud)

在视图的 ViewModel 中。在视图中它显示通过

<textarea asp-for="Result"></textarea>
Run Code Online (Sandbox Code Playgroud)

所以我决定将其变成一个具有默认 get 和 set 的属性:

public string Result { get; set; }
Run Code Online (Sandbox Code Playgroud)

但是,当我这样做时,如果我在视图中保持与我的团队成员使用字段而不是属性时相同的方法,则输出不会显示在文本区域中。相反,我必须这样做才能让它显示在文本区域中:

<textarea>@Model.Result</textarea>
Run Code Online (Sandbox Code Playgroud)

现在我问自己为什么会发生这种情况。我不能用 asp-for 显示属性吗?使用字段或属性作为结果,哪个更好?

提前谢谢了!

Iof*_*ure 7

就我而言,发生这种行为是因为我的文本区域上没有单独的结束标签。我知道您上面的示例在使用该方法时有它asp-for,但如果这是复制/粘贴错误,您可能需要再次查看。

<textarea asp-for="Message" type="text" class="form-control" rows="5" id="MessageInputField" autofocus></textarea>
Run Code Online (Sandbox Code Playgroud)

相对于:

<textarea asp-for="Message" type="text" class="form-control" rows="5" id="MessageInputField" autofocus />
Run Code Online (Sandbox Code Playgroud)

在我看来,这是令人难以置信的恼人的“陷阱”行为。也许如果有人想告诉我为什么不是,那么请启发我,我总是愿意学习。

  • 因为 textarea 不应该是自闭合标签。因为 razor 标签助手会指定它们是否应该运行自关闭标签。(例如 https://github.com/dotnet/aspnetcore/blob/master/src/Mvc/Mvc.TagHelpers/src/InputTagHelper.cs#L17 与 https://github.com/dotnet/aspnetcore/blob/master/ src/Mvc/Mvc.TagHelpers/src/TextAreaTagHelper.cs#L15) (2认同)

Chr*_*att 2

您实际上应该使用属性,如果<textarea>@Model.Result</textarea>有效,<textarea asp-for="Result"></textarea>也应该使用。唯一的原因是 是否ModelState具有不同的值Result(因为后一种形式实际上使用ModelState,而前者显然是Model直接使用)。

ModelStateRequest由、ViewData/ViewBag和 finally中的值组成Model,因此,例如,如果您要执行类似 的操作,那么实际上会覆盖inViewBag.Result = String.Empty中的值。ModelModelState

这里没有足够的代码来真正诊断确切的问题,但我会寻找您可能使用“结果”(不区分大小写)的其他地方。如果您接受它作为请求参数或设置ViewBag成员等,那就是您的问题。