我一直在做一个小型学校项目,并决定第一次使用.net core(MVC(。我有一个小按钮,我可以单击它,它在后台执行"ipconfig"命令并在文本区域中显示输出。起初,我的团队伙伴只使用
public string Result;
在视图模型中的视图。在视图中,它通过以下方式显示
<textarea asp-for="Result"></textarea>
所以我决定把它变成一个默认的 get 和 set 的属性:
public string Result { get; set; }
但是,当我这样做时,如果我在视图中保持与我的团队成员使用字段而不是属性时相同的方法,则输出不会显示在文本区域中。相反,我必须这样做才能让它显示在文本区域中:
<textarea>@Model.Result</textarea>
现在我问自己为什么会这样。我不能使用 asp-for 显示属性吗?结果是字段还是属性,什么会更好?
提前非常感谢!
就我而言,之所以发生这种行为,是因为我的文本区域没有单独的结束标记。我知道您在使用asp-for
方法时上面的例子有它,但如果这是复制/粘贴错误,您可能需要再次查看它。
<textarea asp-for="Message" type="text" class="form-control" rows="5" id="MessageInputField" autofocus></textarea>
与以下相反:
<textarea asp-for="Message" type="text" class="form-control" rows="5" id="MessageInputField" autofocus />
在我看来,这是非常烦人的"陷阱"行为。 也许如果有人想告诉我为什么不是,那么请开导我,我总是愿意学习。
您实际上应该使用属性,如果<textarea>@Model.Result</textarea>
有效,<textarea asp-for="Result"></textarea>
也应该使用。它不会的唯一原因是如果ModelState
对Result
具有不同的值(因为后一种形式实际上使用ModelState
,而前者显然直接使用Model
(。
ModelState
由来自Request
、ViewData
/ViewBag
的值组成,最后是Model
,所以例如,如果你要做类似ViewBag.Result = String.Empty
的事情,那实际上会覆盖ModelState
中Model
的值。
这里没有足够的代码来真正诊断确切的问题,但我会寻找您可能使用"result"(不区分大小写(的其他地方。如果您接受它作为请求参数或设置ViewBag
成员等,那就是您的问题。
当我想要双向绑定时,我发现这在 .Net Core 6 中有点奇怪 - 即显示结果
使用 asp-for 我必须自行关闭标签并添加额外的文本区域关闭标签才能显示结果。
<textarea asp-for="Result" />@Model.Result</textarea>
这有效,但在语法上不正确。 如果没有自关闭标记,则不会显示结果
<textarea asp-for="Result">@Model.Result</textarea> @*Does not display the value*@
仅供显示,这更正确
<textarea>@Model.Result</textarea>
回答太晚了,但希望将来能帮助某人。所以我了解到asp-for
将覆盖您可能尝试在此处显示为默认阅读的textarea
的内容。作为替代方案,我发现一个简单的Html.TextArea
标签助手就可以了。您将获得asp-for
获得的所有模型验证行为以及textarea
中的默认内容。
使用这个:
@Html.TextArea("MyPropNameInModel", "my default content for textarea", new { @class = "form-control" });
而不是:
<textarea asp-for="MyPropNameInModel" class="form-control">my default content for textarea</textarea>