web-dev-qa-db-ja.com

Razorで非表示の値を設定する方法

私がやろうとしていることは悪い考えであることは知っていますが、今のところ特定の制約があります。

1つの同じMVC3コードベースを使用する複数のサイトがあります。そのうちの1つの要件は、フォームからいくつかの必須フィールドを非表示にすることです。

コントローラーを変更してこれらのフィールドのデフォルトを設定するのが最善のアプローチであることは知っていますが、コードを変更せずにこの特定のサイトのビューのみを変更してこれを達成したいと思います。

それでは、特定のモデルプロパティをビューのデフォルト値に設定するにはどうすればよいですか?理想は次のようなものでなければなりません:

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

編集:詳細説明

そのため、実際にはこれはサブビューにあり、2つの異なるメインビューで使用されます。これらのプロパティは、ある特定のメインビューが使用され、他のメインビューが使用されていない場合にのみ設定する必要があります。

したがって、デフォルトの設定は、その特定の「メイン」ビューに移動する必要があると思います。サブビューでHiddenForを使用できず、メインでHtml.Hiddenを使用できないようです。

外側のビューであるサブビューをチェックインする方法はありますか?

36
Sunny Milenov

Hiddenと並んでHiddenForヘルパーがあり、値を設定できます。

@Html.Hidden("RequiredProperty", "default")

[〜#〜] edit [〜#〜]質問に対して行った編集に基づいて、これを行うことができますが、あなたはそれを領土に移していると思います長期的には、コードを変更するために戦う方が安くて効果的です。すでに述べたように、自分でも、コントローラーまたはビューモデルはデフォルトを設定する必要があります。

このコード:

<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]を直接取得する代わりにスタックを歩くこともできます。

35
David Ruttka

私が正しいと理解すれば、次のようなものが得られます。

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

そして、それを得るためにあなたは書く必要があります:

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

厳密に型指定されたビューの場合。

70
Piotr Czyż

私はPiotrの答えに行きましたが(すべてが1行であるため)、あなたのサンプルがあなたが思っているよりもあなたのソリューションに近いことに驚きました。持っているものから、Htmlヘルパーメソッドを使用する前にモデル値を割り当てるだけです。

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

どうですか

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)
0
mimo