0

さまざまなデータ クエリ用の Web API エンドポイントを持つ MVC ソリューションを実装しています。この投稿で説明されている手法を使用して、検証の問題をサービス層に分離しています。

特定の質問にスキップしたい場合は、この投稿の最後にTL;DRがあります。

これが私のApiControllerコードです:

[Authorize]
public class FriendsController : ApiController
{
    private IItemService _service;

    public FriendsController()
    {
        _service = new ItemService(new HttpModelStateWrapper(ModelState), new ViewModelRepository());
    }

    public FriendsController(IItemService service)
    {
        _service = service;
    }

    // GET api/friends
    public IEnumerable<User> Get()
    {
        return _service.GetFriends(User.Identity.Name);
    }


 .
 .
 .

    // POST api/friends
    public void Post(Guid id)
    {
        var user = _service.AddFriend(User.Identity.Name, id);  // Handles error and should update ViewModel
        NotificationAsyncController.AddNotification(user);
    }
}

コードは_service.AddFriend(User.Identity.Name, id);次のようになります。

    public User AddFriend(string userName, Guid id)
    {
        try
        {
            return _repository.AddFriend(userName, id);
        }
        catch (Exception e)
        {
            _validationDictionary.AddError("AddFriend", e.Message);
            return null;
        }
    }

_validationDictionaryのようになります。

public class HttpModelStateWrapper : IValidationDictionary
{
    private ModelStateDictionary ModelState;

    public HttpModelStateWrapper(ModelStateDictionary ModelState)
    {
        this.ModelState = ModelState;
    }

    public void AddError(string key, string errorMessage)
    {
        if (ModelState != null)
            ModelState.AddModelError(key, errorMessage);
    }

    public bool IsValid
    {
        get { return ModelState == null ? false : ModelState.IsValid; }
    }
}

_repository.AddFriend(userName, id);がエラーをスローして_validationDictionary.AddError("AddFriend", e.Message);呼び出された場合、 にある ModelState オブジェクトは、 にある ModelState オブジェクトを_validationDictionary更新しないことがわかりましたFriendsController

つまり、AddErrorが呼び出された後、 の ModelState はHttpModelStateWrapper有効ではありませんが、そのメソッドが返され、スコープが に返されるとFriendsController、その ModelState は更新されておらず、まだ有効です!

TL;DR

HttpModelStateWrapperのctor に渡した ModelState オブジェクトを取得するにはどうすればよいですか?FriendsControllerその変更が の ModelState オブジェクトに反映されFriendsControllerますか?

4

1 に答える 1

0

コントローラー全体を渡すだけで、ModelStateオブジェクトにアクセスできるようになりました。

于 2012-10-02T16:35:43.460 に答える