8

ASP.NET MVC の HTML ヘルパーを使用してフォームを生成するため、フォーム フィールドの名前もこれらの HTML ヘルパーによって生成されます。

AJAX を介して現在のページ (モーダル ダイアログなど) に部分ビューをロードするときはいつでも、この部分ビューのモデルに元のビューのモデルの他のフィールドと同じ名前のフィールドが含まれていると、問題が発生します ( ASP.NET MVC は同じ ID を生成します)。

部分ビューに特定のプレフィックスを付けてフィールドをレンダリングするように指示する方法はありますか (後でモデル バインディングがそれらのプレフィックス付きの名前を理解するように)

現在、部分ビュー モデルのフィールドの名前を「PartialDateOfBirth」に変更して、元のページのモデル「DateOfBirth」に干渉しないようにしていますが、AJAX を介して同じ部分ビューをページに複数回ロードすると、うまくいきません...

問題のベストプラクティスの解決策はありますか?

4

2 に答える 2

3

これが私がすることです:

これをプロジェクトに HtmlPrefixScopeExtensions.cs として保存します。

public static class HtmlPrefixScopeExtensions
{
    public static IDisposable BeginPrefixScope(this HtmlHelper html, string htmlFieldPrefix)
    {
        return new HtmlFieldPrefixScope(html.ViewData.TemplateInfo, htmlFieldPrefix);
    }

    internal class HtmlFieldPrefixScope : IDisposable
    {
        internal readonly TemplateInfo TemplateInfo;
        internal readonly string PreviousHtmlFieldPrefix;

        public HtmlFieldPrefixScope(TemplateInfo templateInfo, string htmlFieldPrefix)
        {
            TemplateInfo = templateInfo;
            PreviousHtmlFieldPrefix = TemplateInfo.HtmlFieldPrefix;
            TemplateInfo.HtmlFieldPrefix = htmlFieldPrefix;
        }

        public void Dispose()
        {
            TemplateInfo.HtmlFieldPrefix = PreviousHtmlFieldPrefix;
        }
    }
}

次に、ビューを次のように変更します。

<div class="content">
    <div>
        @Html.EditorFor(model => model.Name)
    </div>
    <div>
        @Html.EditorFor(model => model.Population)
    </div>
</div>

に:

@using (Html.BeginPrefixScope("Country"))
{
    <div class="content">
        <div>
            @Html.EditorFor(model => model.Name)
        </div>
        <div>
            @Html.EditorFor(model => model.Population)
        </div>
    </div>
}

最後に、HtmlPrefixScopeExtensions.cs の場所に一致するビューに using ステートメントを含めることを忘れないでください。次に例を示します。

@using YourNamespace.Helpers

または正しい名前空間を Views/Web.config に追加します (これは断然お勧めのオプションです。一度だけ実行してください!):

<namespaces>
    <add namespace="System.Web.Helpers" />
    ...... 
   <add namespace="YourNamespace.Helpers" /> 
</namespaces>

現在: フィールドの名前は、たとえば「Country.Name」になります。

次に、投稿に一致する名前が必要です。

[HttpPost]
public ActionResult SaveCountry(Country country)
{
    // save logic
    return View();
}

クレジット: Steve Sanderson の素晴らしい BeginCollectionItem クラスを削除しました

于 2013-11-10T01:18:22.477 に答える
0

ID でプレフィックスを渡す独自のヘルパー メソッドを作成します。これは大きな仕事ではありません。

于 2013-09-18T19:51:30.350 に答える