Search code examples
aspnetboilerplate

Failed to load resource: the server responded with a status of 500 (Internal Server Error) dynamic api


downloaded latest(3.0) boilerplate with zero.

Followed up the task creator application implementation on codeproject.com

I have added simple entity (Clients) instead of tasks.

The displaying of tasks work fine. However, when I try to add a new client the it seems that the dynamic api is not available and I get the following error:

image ClientsController:

`[AbpMvcAuthorize] public class ClientsController : MyAppControllerBase { private readonly IClientAppService _clientService;

    public ClientsController(IClientAppService clientService)
    {
        _clientService = clientService;
    }

    public async Task<ViewResult> Index(GetAllClientsInput input)
    {
        var output = await _clientService.GetAll(input);
        var model = new Web.Models.Clients.IndexViewModel(output.Items);
        return View("Index", model);

    }

    public async Task Create(CreateClientInput input)
    {
        await _clientService.Create(input);
    }

    public async Task Delete(CreateClientInput input)
    {
        await _clientService.Create(input);
    }
}` 

Index.js:

(function() {
    $(function() {

        var _clientService = abp.services.app.client;
        var _$modal = $('#ClientCreateModal');
        var _$form = _$modal.find('form');

        _$form.validate();

        _$form.find('button[type="submit"]').click(function (e) {
            e.preventDefault();

            if (!_$form.valid()) {
                return;
            }

            var client = _$form.serializeFormToObject(); //serializeFormToObject is defined in main.js

            abp.ui.setBusy(_$modal);
            _clientService.create(client).done(function () {
                _$modal.modal('hide');
                location.reload(true); //reload page to see new user!
            }).always(function () {
                abp.ui.clearBusy(_$modal);
            });
        });

        _$modal.on('shown.bs.modal', function () {
            _$modal.find('input:not([type=hidden]):first').focus();
        });
    });
})();

Index.cshtml

@section scripts
{
    <environment names="Development">
        <script src="~/js/views/clients/Index.js" asp-append-version="true"></script>
    </environment>

    <environment names="Staging,Production">
        <script src="~/js/views/clients/Index.min.js" asp-append-version="true"></script>
    </environment>
}
<div class="row clearfix">
    <div class="col-lg-12 col-md-12 col-sm-12 col-xs-12">
        <div class="card">
            <div class="header">
                <h2>
                    @L("Clients")
                </h2>
                <ul class="header-dropdown m-r--5">
                    <li class="dropdown">
                        <a href="javascript:void(0);" class="dropdown-toggle" data-toggle="dropdown" role="button" aria-haspopup="true" aria-expanded="false">
                            <i class="material-icons">more_vert</i>
                        </a>
                        <ul class="dropdown-menu pull-right">
                            <li><a href="javascript:void(0);" class=" waves-effect waves-block">Action</a></li>
                            <li><a href="javascript:void(0);" class=" waves-effect waves-block">Another action</a></li>
                            <li><a href="javascript:void(0);" class=" waves-effect waves-block">Something else here</a></li>
                        </ul>
                    </li>
                </ul>
            </div>
            <div class="body table-responsive">
                <table class="table">
                    <thead>
                    <tr>
                        <th>@L("UserName")</th>
                        <th>@L("FullName")</th>
                        <th>@L("EmailAddress")</th>
                        <th>@L("IsActive")</th>
                    </tr>
                    </thead>
                    <tbody>
                    @foreach (var user in Model.Clients)
                    {
                        <tr>
                            <td>@user.FirstName</td>
                            <td>@user.LastName</td>
                            <td>@user.Email</td>
                            <td>@user.Mobile</td>
                        </tr>
                    }
                    </tbody>
                </table>
                <button type="button" class="btn btn-primary btn-circle waves-effect waves-circle waves-float pull-right" data-toggle="modal" data-target="#ClientCreateModal">
                    <i class="material-icons">add</i>
                </button>
            </div>
        </div>
    </div>
</div>
<div class="modal fade" id="ClientCreateModal" tabindex="-1" role="dialog" aria-labelledby="ClientCreateModalLabel" data-backdrop="static">
    <div class="modal-dialog" role="document">
        <div class="modal-content">
            <form name="userCreateForm" role="form" novalidate class="form-validation">
                <div class="modal-header">
                    <h4 class="modal-title">
                        <span>@L("CreateNewClient")</span>
                    </h4>
                </div>
                <div class="modal-body">
                    <div class="form-group form-float">
                        <div class="form-line">
                            <input class="form-control" type="text" name="FirstName" required maxlength="@AbpUserBase.MaxUserNameLength" minlength="2">
                            <label class="form-label">@L("FirstName")</label>
                        </div>
                    </div>
                    <div class="form-group form-float">
                        <div class="form-line">
                            <input type="text" name="LastName" class="form-control" required maxlength="@AbpUserBase.MaxNameLength">
                            <label class="form-label">@L("LastName")</label>
                        </div>
                    </div>
                    <div class="form-group form-float">
                        <div class="form-line">
                            <input type="text" name="Mobile" class="form-control" required maxlength="@AbpUserBase.MaxSurnameLength">
                            <label class="form-label">@L("Mobile")</label>
                        </div>
                    </div>
                    <div class="form-group form-float">
                        <div class="form-line">
                            <input type="email" name="Email" class="form-control" required maxlength="@AbpUserBase.MaxEmailAddressLength">
                            <label class="form-label">@L("Email")</label>
                        </div>
                    </div>
                </div>
                <div class="modal-footer">
                    <button type="button" class="btn btn-default waves-effect" data-dismiss="modal">@L("Cancel")</button>
                    <button type="submit" class="btn btn-primary waves-effect">@L("Save")</button>
                </div>
            </form>
        </div>
    </div>
</div>

client service :

[AbpAuthorize(PermissionNames.Pages_Tenants)]
public class ClientAppService : ApplicationService, IClientAppService
{
    private readonly IRepository<Client> _clientRepository;

    public ClientAppService(IRepository<Client> clientRepository)
    {
        _clientRepository = clientRepository;
    }

    public async Task<ListResultDto<ClientListDto>> GetAll(GetAllClientsInput input)
    {
        var clients = await _clientRepository
            .GetAll().ToListAsync<Client>();

        return new ListResultDto<ClientListDto>(
            ObjectMapper.Map<List<ClientListDto>>(clients));
    }

    public async Task Create(CreateClientInput input)
    {
        var task = ObjectMapper.Map<Client>(input);
        await _clientRepository.InsertAsync(task);
    }
}

the server does not get hit at all on the create action.

any idea what I am missing?


Solution

  • I think there's a misunderstanding with IMustHaveTenant interface. When you derive an entity from IMustHaveTenant you cannot use that entity in host environment. The host has no tenant id. As far as i understand clients are belonging to tenants. So what you have to do is, remove the Clients page from host menu. Whenever you want to see clients of tenants, just use impersonation.

    To show/hide specific menu items you can use requiredPermissionName. A permission can be configured to use just for tenants/host/both. So create a new permission which is configured to be used for tenants. Set that permission while you create new MenuItemDefinition for clients page. That's it!

    Read => https://aspnetboilerplate.com/Pages/Documents/Navigation?searchKey=navigation#registering-navigation-provider