我在ASP.NET mvc中为表单创建强类型的局部视图,其中我想使用隐藏的输入来传达特定视图模型的Id
属性。呈现视图的控制器接受id
参数,在我的RouteConfig.cs中注册为选项url参数,这意味着不相关。
如果控制器的用户名为"Tim"
作为路由参数,并且传递给部分视图的模型的Id
为"e1ac2e44-1e09-4bb4-a7f0-85e1eedf3448"
,则会发生以下情况:
@Html.DisplayFor(m => m.Id)
正确显示我想要的e1ac2e44-1e09-4bb4-a7f0-85e1eedf3448
。
@Html.HiddenFor(m => m.Id)
错误地创建了值为"Tim"
的隐藏输入:
<input id="Id" name="Id" type="hidden" value="Tim">
同样的情况发生在:
@Html.HiddenFor(m => Model.Id)
@Html.HiddenFor(m => m.Id, new { value = Model.Id })
@Html.HiddenFor(m => m.Id, new { value = "Obvious eye-catching string" })
@Html.Hidden("Id", Model.Id)
@Html.Hidden("Id", "Obvious string")
但是,@Html.Hidden("NotId", Model.Id)
使用正确的值创建隐藏输入,但不会使用与视图模型中的预期属性匹配的名称:
<input id="NotId" name="NotId" type="hidden" value="e1ac2e44-1e09-4bb4-a7f0-85e1eedf3448">
随着进一步的活动,我发现TextBoxFor
,TextAreaFor
和EditorFor
的绑定方式与HiddenFor
相同,并显示{{ 1}},而不是字母数字用户ID。这给我留下了两个基本问题:
"Tim"
与其他Razor助手绑定不同?@Html.DisplayFor
而不是路由参数Id
的正确方法/最简单的解决方法是什么?答案 0 :(得分:0)
在此详细发表评论..
HiddenFor和EditorFor是(扩展)方法,用于指示需要将值与表单一起传回。因此,有意义的是,他们会在该RouteValue上寻找用户的特定覆盖(在这里你写了Id)。 DisplayFor是用于显示值的方法,而不会在提交表单时将其传回。在这里,因为你不想传回Model.Id的当前值,你应该使用@Html.DisplayFor(m=> m.Id,new {Hidden})