如何在Razor中设置隐藏值
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何在Razor中设置隐藏值相关的知识,希望对你有一定的参考价值。
我知道我想要做的是坏主意,但我现在有特定的约束。
我有多个站点,使用一个相同的MVC3代码库。对于其中一个,要求是从表单中隐藏一些必填字段。
我知道最好的方法是修改控制器来设置这些字段的默认值,但是我想实现这个只修改这个特定站点的视图而不用更改代码。
那么,如何在视图中将特定模型属性设置为默认值?理想应该是这样的:
@html.HiddenFor(model => model.RequiredProperty)
@model.RequiredProperty = "default"
编辑:更多解释
所以,实际上这是在一个子视图中,由2个不同的主视图使用。只有在使用一个特定的主视图时才需要设置这些属性,而不是其他主视图。
所以,我想默认设置需要转到特定的“主”视图。看起来我不能在子视图中使用HiddenFor,然后在主视图中使用Html.Hidden。
有没有办法检查子视图哪个是外视图?
在Hidden
旁边有一个HiddenFor
帮助器,可以让你设置值。
@Html.Hidden("RequiredProperty", "default")
编辑基于您对问题所做的编辑,你可以做到这一点,但我相信你正在进入一个领域,从长远来看,它会更便宜,更有效地为改变代码而奋斗。如前所述,即使是您自己,控制器或视图模型也应该设置默认值。
这段代码:
<ul>
@{
var stacks = new System.Diagnostics.StackTrace().GetFrames();
foreach (var frame in stacks)
{
<li>@frame.GetMethod().Name - @frame.GetMethod().DeclaringType</li>
}
}
</ul>
会给出这样的输出:
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
因此,假设MVC框架将始终通过相同的堆栈,您可以获取var frame = stacks[8];
并使用声明类型来确定您的父视图是谁,然后使用该确定来设置(或不设置)默认值。你也可以走堆栈,而不是直接抓住[8]
,这将更安全但效率更低。
如果我理解正确你会有这样的事情:
<input value="default" id="sth" name="sth" type="hidden">
为了得到它,你必须写:
@Html.HiddenFor(m => m.sth, new { Value = "default" })
对于强类型视图。
虽然我会选择Piotr的答案(因为它只是一行),但我很惊讶你的样本比你想象的更接近你的解决方案。根据您的拥有,您只需在使用Html帮助程序方法之前指定模型值。
@{Model.RequiredProperty = "default";}
@Html.HiddenFor(model => model.RequiredProperty)
怎么样这样
public static MvcHtmlString HiddenFor<TModel, TProperty>(this HtmlHelper<TModel> htmlHelper, Expression<Func<TModel, TProperty>> expression, object value, object htmlAttributes)
{
return HiddenFor(htmlHelper, expression, value, HtmlHelper.AnonymousObjectToHtmlAttributes(htmlAttributes));
}
public static MvcHtmlString HiddenFor<TModel, TProperty>(this HtmlHelper<TModel> htmlHelper, Expression<Func<TModel, TProperty>> expression, object value, IDictionary<string, object> htmlAttributes)
{
return htmlHelper.Hidden(ExpressionHelper.GetExpressionText(expression), value, htmlAttributes);
}
像这样使用它
@Html.HiddenFor(customerId => reviewModel.CustomerId, Site.LoggedInCustomerId, null)
以上是关于如何在Razor中设置隐藏值的主要内容,如果未能解决你的问题,请参考以下文章
在 Javascript 中设置隐藏的输入值,然后在代码隐藏中访问它