1

私はこの問題に頭を悩ませてきました。ASP.NET の Web サイトを中心に構築されたレガシ アプリケーションがあります。MVCを追加できるように適切なものを追加しましたが、ほとんど正しく動作します。

フォーム タグが含まれている (Html.BeginForm 内にカプセル化された) カミソリ ビューがあります。文字列用のカスタム テンプレート エディターも作成しました。私が抱えている問題は、通常のテキストボックス、editorfor または ValidateFor、ValidationSummary をレンダリングしたいときに、マークアップが生成されないことです。カスタム テンプレートは実行されますが、通常の HtmlHelper が機能していないようです。

これが私の見解です(部分的な見解です)

@model L1.Web.UI.Infrastructure.SectionWrapper<L1.Web.ViewModel.PersonInfoViewModel>

<div class="section">
   @using (Html.BeginForm())
   {
      <div class="pad_10" data-bind="with: sections['PersonInfo']">
         <div data-bind="with: data">
            @Html.ValidationSummary(true)
            <table class="full-table form-horizontal">
               <tbody>
                  <tr>
                     <td width="30%" class="dotted-border-right">
<!-- This kinda work -->
                    @Html.EditorFor(m => m.SectionData.Data.LastName,       
                       "modelTemplateString",
                        new {SectionName = "PersonInfo"})
!-- This doesn't render anything -->
                    @Html.EditorFor(m => m.SectionData.Data.LastName)

私のカスタム テンプレートでは、動作するプレーンな HTML をレンダリングしています。カスタム テンプレートで EditorFor を実行すると、部分的に機能します。検証属性が生成されていません。カスタム テンプレートの ValidateFor または ValidationMessageFor もマークアップを生成しません。これが私のカスタム テンプレートのコードです (/Shared/EditorTemplates にあります)。

@inherits WebViewPage<string>

<div class="control-group">
<label class="control-label" for="@String.Format("input{0}", ViewData.ModelMetadata.PropertyName)" data-bind="localized: {resourceId: '@ViewData.ModelMetadata.PropertyName', resourceStore: $root}"></label>
<div class="controls">
    <input id="@String.Format("input{0}", ViewData.ModelMetadata.PropertyName)" class="input-small" type="text" data-bind="visible: $root.sectionDefinitions['@ViewData["SectionName"]'].isEditing, value: @ViewData.ModelMetadata.PropertyName"/>
    <a class="edit-link" data-bind="visible: $root.sectionDefinitions['@ViewData["SectionName"]'].isInReadMode">
        <strong data-bind="text: @ViewData.ModelMetadata.PropertyName"></strong>
    </a>
    @{ Html.ValidateFor(m => m); }
</div>

また、EditorFor でカスタム テンプレート名を指定しなくても、カスタム テンプレートが常に使用されていると考えて、プロジェクトからカスタム テンプレートを完全に削除しようとしました。これは違いはありませんでした。私のプロジェクトは部分的に HtmlHelpers をレンダリングできないようです。

また、フォームタグが作成された後に ViewContext.FormContext が null ではないことも確認しましたが、その部分は問題ないようです。

どんな助け/提案も大歓迎です。

ありがとう

4

1 に答える 1

0

/Shared/EditorTemplates フォルダーにあるエディター テンプレートの完全なファイル名は?

@Html.EditorFor(m => m.SectionData.Data.LastName) はおそらく String.cshtml を呼び出し、もう一方は modelTemplateString.cshtml と呼ばれる必要があります

また、@model 文字列タグがエディター テンプレートの上部にあることを確認する必要があります。

私が見ることができることから、あなたのテンプレートは、送信しているモデルデータを実際に使用しているのではなく、ViewData オブジェクトを使用しているだけです。

于 2012-05-31T16:07:45.060 に答える