如何在Razor中设置隐藏值

Sun*_*nov 36 model-view-controller model razor setdefault asp.net-mvc-3

我知道我想要做的是坏主意,但我现在有特定的约束.

我有多个站点,使用一个相同的MVC3代码库.对于其中一个,要求是从表单中隐藏一些必填字段.

我知道最好的方法是修改控制器来设置这些字段的默认值,但我想实现这个只修改这个特定站点的视图,而不用更改代码.

那么,如何在视图中将特定模型属性设置为默认值?理想应该是这样的:

@Html.HiddenFor(model => model.RequiredProperty)
@model.RequiredProperty = "default"
Run Code Online (Sandbox Code Playgroud)

编辑:更多解释

所以,实际上这是在子视图中,由2个不同的主视图使用.只有在使用一个特定的主视图时才需要设置这些属性,而不是其他主视图.

所以,我想默认设置需要转到特定的"主"视图.看起来我不能在子视图中使用HiddenFor,然后在主视图中使用Html.Hidden.

有没有办法检查子视图哪个是外视图?

Pio*_*zyż 70

如果我理解正确你会有这样的事情:

<input value="default" id="sth" name="sth" type="hidden">
Run Code Online (Sandbox Code Playgroud)

为了得到它,你必须写:

@Html.HiddenFor(m => m.sth, new { Value = "default" })
Run Code Online (Sandbox Code Playgroud)

对于强类型视图.

  • 似乎'价值'必须大写'价值' (13认同)
  • 'HiddenFor`与`Hidden`的一个缺点是`HiddenFor`在输出中包含验证字符串(例如`data-val-required`和/或`data-val-number`属性)....即使它是一个隐藏的领域. (7认同)

Dav*_*tka 36

Hidden旁边有一个帮助器HiddenFor,可以设置值.

@Html.Hidden("RequiredProperty", "default")
Run Code Online (Sandbox Code Playgroud)

编辑基于您对问题所做的编辑,你可以做到这一点,但我相信你正在进入一个领域,从长远来看,它会更便宜,更有效地为改变代码而奋斗.如前所述,即使是您自己,控制器或视图模型也应该设置默认值.

这段代码:

<ul>
@{
        var stacks = new System.Diagnostics.StackTrace().GetFrames();
        foreach (var frame in stacks)
        {
            <li>@frame.GetMethod().Name - @frame.GetMethod().DeclaringType</li>
        }
}
</ul>
Run Code Online (Sandbox Code Playgroud)

会给出这样的输出:

Execute - ASP._Page_Views_ViewDirectoryX__SubView_cshtml
ExecutePageHierarchy - System.Web.WebPages.WebPageBase
ExecutePageHierarchy - System.Web.Mvc.WebViewPage
ExecutePageHierarchy - System.Web.WebPages.WebPageBase
RenderView - System.Web.Mvc.RazorView
Render - System.Web.Mvc.BuildManagerCompiledView
RenderPartialInternal - System.Web.Mvc.HtmlHelper
RenderPartial - System.Web.Mvc.Html.RenderPartialExtensions
Execute - ASP._Page_Views_ViewDirectoryY__MainView_cshtml
Run Code Online (Sandbox Code Playgroud)

因此,假设MVC框架将始终通过相同的堆栈,您可以获取var frame = stacks[8];并使用声明类型来确定您的父视图是谁,然后使用该确定来设置(或不设置)默认值.您也可以走堆栈而不是直接抓取[8]哪个更安全但效率更低.


ala*_*ans 10

虽然我会选择Piotr的答案(因为它只是一行),但我很惊讶你的样本比你想象的更接近你的解决方案.根据您的拥有,您只需在使用Html帮助程序方法之前指定模型值.

@{Model.RequiredProperty = "default";}
@Html.HiddenFor(model => model.RequiredProperty)
Run Code Online (Sandbox Code Playgroud)