9

Mongo、NoRM、MVC.Netで新しいプロジェクトを開始しています。

FluentNHibernateを使用していたため、IDが整数でしたが、現在はIDがObjectIdになっています。したがって、編集リンクがある場合、私のURLは次のようになります。

Webサイト/管理者/編集/23,111,160,3,240,200,191,56,25,0,0,0

また、ObjectIdとしてコントローラーに自動的にバインドされません

これを処理するための提案/ベストプラクティスはありますか?IDを毎回エンコード/デコードする必要がありますか?

ありがとう!

4

5 に答える 5

16

このようなカスタムモデルバインダーを使用します... (公式のC#MongoDBドライバーに対して機能します)

protected void Application_Start()
{
    ...
    ModelBinders.Binders.Add(typeof(ObjectId), new ObjectIdModelBinder()); 
}

public class ObjectIdModelBinder : DefaultModelBinder
{
    public override object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext)
    {
        var result = bindingContext.ValueProvider.GetValue(bindingContext.ModelName);
        if (result == null)
        {
            return ObjectId.Empty;
        }
        return ObjectId.Parse((string)result.ConvertTo(typeof(string)));
    }
}
于 2010-12-04T07:09:04.480 に答える
14

私は以下を使用します

public class ObjectIdModelBinder : DefaultModelBinder
{
    public override object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext)
    {
        string value = controllerContext.RouteData.Values[bindingContext.ModelName] as string;
        if (String.IsNullOrEmpty(value)) {
            return ObjectId.Empty;
        }
        return new ObjectId(value);
    }
}

protected void Application_Start()
    {
        ......

        ModelBinders.Binders.Add(typeof(ObjectId), new ObjectIdModelBinder()); 
    }

ほとんど忘れて、からURLを作成しますObjectId.ToString()

于 2010-07-15T05:48:36.797 に答える
0

ObjectIdタイプについてはよくわかりませんが、ルート制約をのインスタンスに変換するカスタムモデルバインダーを作成できます。idObjectId

于 2010-06-29T17:39:37.477 に答える
0

[MongoIdentifier]属性を使用して、任意のプロパティを一意のキーとして機能させることができることをご存知ですか?

私は、すべてのエンティティを「url slug」プロパティで表し、そのプロパティを[MongoIdentifier]で装飾することで、WordPressから技術を借りてこの問題を解決してきました。

したがって、ジョニーウォーカーという名前の人がいたら、「ジョニーウォーカー」のナメクジを作成します。これらのURLスラッグが一意であり、醜いオブジェクトIDなしでクリーンなURLを維持できることを確認する必要があります。

于 2010-06-29T18:34:06.023 に答える
0

Web APIの場合、WebApiConfigにカスタムパラメータバインディングルールを追加できます。

public static class WebApiConfig
{
    public static void Register(HttpConfiguration config)
    {
        //...
        config.ParameterBindingRules.Insert(0, GetCustomParameterBinding);
        //...
    }

    public static HttpParameterBinding GetCustomParameterBinding(HttpParameterDescriptor descriptor)
    {
        if (descriptor.ParameterType == typeof(ObjectId))
        {
            return new ObjectIdParameterBinding(descriptor);
        }
        // any other types, let the default parameter binding handle
        return null;
    }

    public class ObjectIdParameterBinding : HttpParameterBinding
    {
        public ObjectIdParameterBinding(HttpParameterDescriptor desc)
            : base(desc)
        {
        }

        public override Task ExecuteBindingAsync(ModelMetadataProvider metadataProvider, HttpActionContext actionContext, CancellationToken cancellationToken)
        {
            try
            {
                SetValue(actionContext, new ObjectId(actionContext.ControllerContext.RouteData.Values[Descriptor.ParameterName] as string));
                return Task.CompletedTask;
            }
            catch (FormatException)
            {
                throw new BadRequestException("Invalid ObjectId format");
            }
        }
    }
}

そして、コントローラーに追加の属性なしでそれを使用します:

 [Route("{id}")]
 public IHttpActionResult Get(ObjectId id)
于 2017-11-04T04:34:33.600 に答える