如何在Razor中设置隐藏值

问题描述 投票:34回答:4

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

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

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

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

@Html.HiddenFor(model => model.RequiredProperty)
@model.RequiredProperty = "default"

编辑:更多解释

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

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

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

asp.net-mvc-3 razor model-view-controller model setdefault
4个回答
34
投票

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],这将更安全但效率更低。


67
投票

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

<input value="default" id="sth" name="sth" type="hidden">

为了得到它,你必须写:

@Html.HiddenFor(m => m.sth, new { Value = "default" })

对于强类型视图。


10
投票

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

@{Model.RequiredProperty = "default";}
@Html.HiddenFor(model => model.RequiredProperty)

0
投票

怎么样这样

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)
© www.soinside.com 2019 - 2024. All rights reserved.