41

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

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

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

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

@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の答えを採用していましたが(すべてが1行になっているため)、サンプルが思ったよりもソリューションに近いことに驚きました。持っているものから、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 に答える