41

我知道我想做的是坏主意,但我现在有特定的限制。

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

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

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

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

编辑:更多解释

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

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

有没有办法检查作为外部视图的子视图?

4

4 回答 4

74

如果我理解正确,您将有以下内容:

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

要得到它,你必须写:

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

对于强类型视图。

于 2011-09-07T14:13:09.520 回答
40

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

于 2011-06-29T13:25:55.467 回答
12

虽然我会接受 Piotr 的回答(因为它都在一行中),但令我惊讶的是,您的样本比您想象的更接近您的解决方案。根据您所拥有的,您只需在使用 Html 辅助方法之前分配模型值。

@{Model.RequiredProperty = "default";}
@Html.HiddenFor(model => model.RequiredProperty)
于 2014-06-23T18:51:17.793 回答
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)
于 2014-01-22T13:42:05.400 回答