如何在Razor中设置隐藏值

时间:2011-06-29 13:21:16

标签: asp.net-mvc-3 razor model-view-controller model setdefault

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

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

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

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

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

编辑:更多解释

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

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

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

4 个答案:

答案 0 :(得分:68)

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

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

要得到它,你必须写:

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

用于强类型视图。

答案 1 :(得分:35)

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

答案 2 :(得分:10)

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

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

答案 3 :(得分: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)