0

ASP.NETMVC3モデル検証ロジックのソリューションが必要です。私はカスタムローカリゼーションソリューションを持っており、次のような翻訳メソッドを介してすべての文字列を渡します。

    @Localizer.Translate("Hello world!") 

注:わかりませんが、このアプローチはQTローカリゼーションロジックに由来すると思います。WordPressもsmillarテクニックを使用しています。

このソリューションを次のようなモデル検証属性に適用しようとすると、次のようになります。

    [Required(ErrorMessage = Localizer.Translate( "Please enter detail text!"))]
    [DisplayName(Localizer.Translate( "Detail"))]
    public string Details { get; set; }

コンパイラは私にこのエラーを与えます:

エラー1属性の引数は、定数式、typeof式、または属性パラメーターtypeの配列作成式である必要があります。

そのため、エラーメッセージとDisplayName属性をその場で変更しようとしましたが、変更できませんでした。

これを行う方法はありますか?もしあれば、それは私にとって命の恩人かもしれません:)

4

3 に答える 3

1

リソースファイルを使用してローカリゼーションを行うことができます。

プロジェクトにリソースファイルを追加します(Visual Studioから[新しいアイテムの追加]ウィザードを使用できます。MyResourcesType.resxと呼びます)。次に、次のような検証メッセージを追加します。

[Required(
    ErrorMessageResourceType = typeof(MyResourcesType),
    ErrorMessageResourceName = "MyMessageIdOnTheResourcesFile")]

これからは、言語を変更するだけで、新しいリソースファイルを追加できます。この質問の最初の回答を確認してください。

ちなみに、DisplayNameAttributeではなく、System.ComponentModel.DataAnnotations名前空間のDisplayAttributeを使用してください。これはMVCで使用される属性であり、ローカリゼーションも実行できます。

[Display(
    ResourceType = typeof(MyResourcesType),
    Name = "MyPropertyIdOnResourcesFile_Name",
    ShortName = "MyPropertyIdOnResourcesFile_ShortName",
    Description = "MyPropertyIdOnResourcesFile_Description")]
于 2011-10-30T00:58:16.323 に答える
0

属性が機能する方法は、属性が静的にコードにコンパイルされることです。したがって、属性を使用する場合、そのような動的な機能を持つことはできません。

Jotaの答えは、物事を行うための推奨される方法ですが、独自のソリューションを使用することにした場合は、独自の属性を作成し、その属性にメッセージを検索するコードを追加できます。

于 2011-10-30T04:22:55.333 に答える
0

カスタムの@Html.LabelFor()および@ html.DescriptionFor()ヘルパーを作成する回避策があります。

私のヘルパー:

namespace MyCMS.Helpers
{
public static class Html
{
    public static MvcHtmlString DescriptionFor<TModel, TValue>(
        this HtmlHelper<TModel> self, 
        Expression<Func<TModel, TValue>> expression)
    {
        var metadata = ModelMetadata.FromLambdaExpression(expression, self.ViewData);
        var description = Localizer.Translate(metadata.Description);

        return MvcHtmlString.Create(string.Format(@"<span class=""help-block"">{0}</span>", description));
    }

    public static MvcHtmlString LabelFor<TModel, TValue>(
        this HtmlHelper<TModel> self, 
        Expression<Func<TModel, TValue>> expression, 
        bool showToolTip
    )
    {
        var metadata = ModelMetadata.FromLambdaExpression(expression, self.ViewData);
        var name = Localizer.Translate(metadata.DisplayName);

        return MvcHtmlString.Create(string.Format(@"<label for=""{0}"">{1}</label>", metadata.PropertyName, name));
    }
}
}

私の見解は:

@using MyCMS.Localization; @using MyCMS.Helpers;

    <div class="clearfix ">
        @Html.LabelFor(model => model.RecordDetails.TitleAlternative)
        <div class="input">
            @Html.TextBoxFor(model => model.RecordDetails.TitleAlternative, new { @class = "xxlarge" })
            @Html.ValidationMessageFor(model => model.RecordDetails.TitleAlternative)
            @Html.DescriptionFor(model => model.RecordDetails.TitleAlternative)
        </div>
    </div>

そして私は私のローカリゼーションアプローチを使うことができます:)

みんなありがとう...

于 2011-10-30T18:23:49.263 に答える