2

ModelBinding に bindingContext.ValueProvider.GetValue(bindingContext.ModelName) があり、null を返しますが、bindingContext.ValueProvider.GetValue("id") を使用すると正しいレコードが返されます。何が欠けているのですか?どういうわけかモデルクラスを登録することになっていますか?

public class EntityModelBinder<TEntity>: IModelBinder where TEntity : Entity
{
    private readonly IUnitOfWork unitOfWork;

    public EntityModelBinder(IUnitOfWork unitOfWork)
    {
        this.unitOfWork = unitOfWork;
    }

    public object BindModel(ControllerContext controllerContext,
        ModelBindingContext bindingContext)
    {
        ValueProviderResult value =  bindingContext.ValueProvider.GetValue(bindingContext.ModelName);

        var id = Guid.Parse(value.AttemptedValue);

        var entity = ((IGenericRepository<TEntity>)unitOfWork.GetRepository(typeof(TEntity))).GetByID(id);

        return entity;
    }
}

また、コントローラー呼び出しは「Bill」であり、私のエンティティ クラスの 1 つであり、UnitOfWork の一部です。

public ActionResult Edit(Bill bill)
    {            
        var model = Mapper.Map<Bill, BillEditModel>(bill);
    return View("Edit",model);
    }
4

1 に答える 1

0

私は mvc の専門家ではありませんが、あなたの問題について考えがあります。作業単位から Bill エンティティを取得しようとしていると仮定しています。アクション メソッドは parameter を定義しますBill bill。これは、MVC がbindingContext.ModelName「id」ではなく「bill」に設定されることを意味します。

モデル バインディングを通じて Bill エンティティを取得しようとする代わりに、コントローラー内で作業単位を使用することをお勧めします。したがって、編集アクションは次のようになります

public ActionResult Edit(Guid id)
{
     Bill bill = _unitOfWork.GetByID(id);
}

Controller コンストラクターは次のようになります。

public MyController(IUnitOfWork uow) {
    _unitOfWork = uow;
}

これは、DI を使用していることを前提としています。

モデル バインダーを使用してリポジトリからエンティティを取得するのは危険だと思います。GetByID メソッドが例外をスローしない限り、MVC はリクエスト データ内の Bill エンティティの検索を続行します。ユーザーがリポジトリに存在しない新しいエンティティを投稿するシナリオを想像してください。コントローラーは、このエンティティが実際にリポジトリに存在するかどうかを確認するために、追加の作業を行う必要があります。

コントローラー内で作業単位を使用することをお勧めします。

于 2013-01-15T16:17:08.090 に答える