0

グーグルで検索するのにうんざりしていて、正確な答えが見つかりませんでした。

oradditionalViewDataのパラメーターを使用してビューからテンプレートに日付を渡すことができることはわかっていますが、テンプレートからデータを戻したい!.EditorFor().DisplayFor()

私は私Date.cshtmlの中に持ってい~/Views/Shared/EditorTemplates/ます。私のモデルプロパティはすでに次のようなものを持っています:

public class Person
{
    [DisplayFormat(DataFormatString = "{0:d}")]
    [DataType(DataType.Date)]
    public Nullable<DateTime> BirthDate { get; set; }
}

とビュー:

@Html.EditorFor(model => model.BirthDate)

ビューが日付テンプレートを使用するときはいつでもdatepickerスクリプトをロードしたいだけです。だから私RequireDatePickerは私のテンプレートでこのように使用しようとします:

@model DateTime?
@Html.TextBox(...)
@{ViewBag.RequireDatePicker = true;}

との下部に_Layout.cshtml

    @Scripts.Render("~/bundles/jquery")
    @if (ViewBag.RequireDatePicker == true)
    {
        <script type="text/javascript">
            if (!Modernizr.inputtypes.date) {
                // Todo: use Modernizr.load
                $(function () {
                    $("input[type='date']").datepicker();
                });
            }
        </script>
    }

問題は、ビュー/部分および表示/エディター テンプレートとは異なるコンテキストを持っていることを認識ViewBagViewDataていることです。これを行う最善の方法は何ですか?


次のように、ルートデータによってテンプレートからビューにデータを渡すことができるように修正します。

@{ViewContext.RouteData.DataToken["requireDatePicker"] = true;}

ただし、データを渡すのではなく、これだけを渡すことになります。

  1. バンドル"~/bundles/jqueryui"を持っている

    • そこからjquery ui日付ピッカー機能を削除します(そしてに移動し"~/bundles/jqueryui-datepicker"ます)
    • Modernizr.inputtypes.dateチェックを入れModernizr.loadてロードする"~/bundles/jqueryui-datepicker"
  2. _layout.cshtmlを確認するために変更する必要はありませんRequireDatePicker@Scripts.Render("~/bundles/jquery")@Scripts.Render("~/bundles/jqueryui")十分な sinecModernizr.loadが既に含まれています。

  3. RequireDatePickerfromDate.cshtmlから view または _Layout.cshtmlに渡す必要はありませんModernizr.load

4

1 に答える 1

0

次の記事で説明されているように、動的な JavaScript バンドルを作成できます。

http://neimke.blogspot.co.nz/2011/12/composing-child-views-with-bundles.html

基本的に、テンプレートのエディターは次のコードを呼び出します

@{
  var bundle = Microsoft.Web.Optimization.BundleTable.Bundles.GetRegisteredBundles()
    .Where(b => b.TransformType == typeof(Microsoft.Web.Optimization.JsMinify))
    .First();

  bundle.AddFile("~/Scripts/DatePicker.js");
}

ただし、Where 句を代わりに特定のバンドルを検索するものに置き換えたい場合があります。子ビューの JavaScript を含めるためのものかもしれません。

極端にやりたい場合は、おそらく razor ビュー エンジンまたは WebViewPage を拡張して、レンダリングされるすべてのビューに一致する View.cshtml.js を探し、それをバンドルに追加することができます。

于 2012-10-19T03:09:14.157 に答える