ASP.NET MVC2プレフィックス付きのコントロールを使用したクライアントサイド検証問題

StackOverflow https://stackoverflow.com/questions/2759167

質問

問題は、ページに同じタイプの2つのコントロールを配置する場合、バインディング用の異なるプレフィックスを指定する必要があります。この場合、フォームの直後に生成された検証ルールが正しくありません。では、ケースのクライアント検証作業をどのように取得するか?:

ページには:

<%
    Html.RenderPartial(ViewLocations.Shared.PhoneEditPartial, new PhoneViewModel { Phone = person.PhonePhone, Prefix = "PhonePhone" });
    Html.RenderPartial(ViewLocations.Shared.PhoneEditPartial, new PhoneViewModel { Phone = person.FaxPhone, Prefix = "FaxPhone" });
%>

コントロールViewusercontrolu003CPhoneViewModel> :

<%= Html.TextBox(Model.GetPrefixed("CountryCode"), Model.Phone.CountryCode) %>
<%= Html.ValidationMessage("Phone.CountryCode", new { id = Model.GetPrefixed("CountryCode"), name = Model.GetPrefixed("CountryCode") })%>

どこ Model.GetPrefixed("CountryCode") 接頭辞に応じて、「faxphone.countrycode」または「phonephone.countrycode」を返すだけです


そして、フォームの後に生成された検証ルールは次のとおりです。それらは、フィールド名「Phone.CountryCode」に対して複製されています。目的の結果は、各フィールド名の2つのルール(必須、番号)です。Alt Text http://www.freeimagehosting.net/uploads/37fbe720bf.png

質問はやや複製されています ASP.NET MVC2クライアントサイドの検証とIDの問題を複製しますしかし、手動でIDを生成するというアドバイスは役に立ちません。

役に立ちましたか?

解決

テキストボックスと検証の両方で同じプレフィックスを設定する正しい方法:

<% using (Html.BeginHtmlFieldPrefixScope(Model.Prefix)) { %>
   <%= Html.TextBoxFor(m => m.Address.PostCode) %>
   <%= Html.ValidationMessageFor(m => m.Address.PostCode) %>
<% } %>

どこ

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

    private class HtmlFieldPrefixScope : IDisposable
    {
        private readonly TemplateInfo templateInfo;
        private readonly string previousHtmlFieldPrefix;

        public HtmlFieldPrefixScope(TemplateInfo templateInfo, string htmlFieldPrefix)
        {
            this.templateInfo = templateInfo;

            previousHtmlFieldPrefix = templateInfo.HtmlFieldPrefix;
            templateInfo.HtmlFieldPrefix = htmlFieldPrefix;
        }

        public void Dispose()
        {
            templateInfo.HtmlFieldPrefix = previousHtmlFieldPrefix;
        }
    }
}

(偶然、Steve Sandersonのブログのコードで解決策を見つけました http://blog.stevensanderson.com/2010/01/28/editing-a-variable-lent-list-aspnet-mvc-2-style/)

また、html.editor forアプローチが機能するはずであり、ここで提案されるようになるようです。 ASP.NET MVC 2 -ViewModelプレフィックス

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top