【问题标题】:How to set a hidden value in Razor如何在 Razor 中设置隐藏值
【发布时间】:2011-09-25 03:58:14
【问题描述】:

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

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

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

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

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

编辑:更多解释

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

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

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

【问题讨论】:

  • 如果没有设置默认值,为什么不在视图模型内部设置呢?这就是视图模型的用途
  • jgauffin:要求是“无后端代码更改”

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


【解决方案1】:

如果我理解正确,你会得到这样的:

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

要得到它,你必须写:

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

用于强类型视图。

【讨论】:

  • HiddenForHidden 的一个缺点是HiddenFor 在输出中包含验证字符串(例如data-val-required 和/或data-val-number 属性)......即使它是一个隐藏字段。
  • 看来'value'必须大写'Value'
【解决方案2】:

HiddenFor 旁边有一个Hidden 助手,可让您设置值。

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

【讨论】:

  • 有效......但我没有很好地解释真实情况。编辑问题,请审查。谢谢
  • @Sunny 查看编辑,但请仅在您试图避免代码更改/部署的紧急情况下使用它
  • 哇,谢谢。我最终在 @Html.Partial 之后使用 jQuery 来按 ID 设置字段。丑陋,但有效:)
  • @Sunny 如果您要求网站的所有用户都启用 JavaScript,那应该没问题。如果这不是您对用户的要求,您应该找到一种方法,即使禁用 JavaScript,所有功能也能正常工作。
  • HiddenHiddenFor 相比也提供了更轻量级的输出。 HiddenFor 可以在输出中包含多个验证字符串,即使它被隐藏并且不会被使用。
【解决方案3】:

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

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

【讨论】:

    【解决方案4】:

    这样怎么样

    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)
    

    【讨论】:

      猜你喜欢
      • 2015-05-09
      • 1970-01-01
      • 1970-01-01
      • 2011-08-01
      • 2018-09-11
      • 1970-01-01
      • 2019-11-17
      • 2012-03-26
      • 1970-01-01
      相关资源
      最近更新 更多