2017-10-07 1 views
0

téléchargé dernier (3.0) passe-partout avec zéro.Impossible de charger la ressource: le serveur a répondu avec un état de 500 (erreur de serveur interne) dynamique

Suivi le créateur de la tâche mise en œuvre de l'application sur codeproject.com

J'ai ajouté une entité simple (Clients) au lieu des tâches.

L'affichage des tâches fonctionne correctement. Cependant, lorsque je tente d'ajouter un nouveau client le, il semble que l'api dynamique n'est pas disponible et je reçois l'erreur suivante:

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> 

service client:

[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); 
    } 
} 

le serveur ne soit pas touché du tout sur l'action de créer .

une idée de ce que je manque?

+0

Pouvez-vous vérifier dans le journal des erreurs '* .Web.Mvc \ App_Data \ Logs'? – aaron

+0

merci beaucoup. le fichier journal en dit beaucoup. Le client implémente IMustHaveTenant. et comme je suis connecté en tant qu'hôte, l'erreur indique "Impossible de définir TenantId à 0 pour les entités IMustHaveTenant!" Je souhaite que je pourrais voir cet avertissement au lieu d'obtenir l'erreur interne de serveur! – akd

+0

Eh bien, c'est une erreur de programmation et ne devrait pas être visible pour le client. – aaron

Répondre

1

Je pense qu'il y a un malentendu avec l'interface IMustHaveTenant. Lorsque vous dérivez une entité de IMustHaveTenant, vous ne pouvez pas utiliser cette entité dans l'environnement hôte. L'hôte n'a pas d'identifiant de locataire. Autant que je comprends les clients appartiennent aux locataires. Donc, ce que vous avez à faire est de supprimer la page Clients du menu hôte. Chaque fois que vous voulez voir des clients de locataires, utilisez simplement l'usurpation d'identité. Pour afficher/masquer des éléments de menu spécifiques, vous pouvez utiliser requiredPermissionName. Une autorisation peut être configurée pour être utilisée uniquement pour les locataires/hôte/les deux. Créez donc une nouvelle autorisation configurée pour être utilisée par les locataires. Définissez cette autorisation lorsque vous créez une nouvelle page MenuItemDefinition pour les clients. C'est tout!

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

+0

Vous ne savez pas s'il existe un moyen facile de supprimer le menu du menu hôte ou non. Je pense que le menu est partagé entre les hôtes et les locataires. Cependant, il serait logique de conserver le menu, mais désactiver désactiver l'ajout d'un nouveau client. Parce que l'hôte devrait pouvoir accéder et voir toute la liste des clients de toute façon. – akd

+0

J'ai mis à jour mon asnwer avec l'utilisation de la propriété requiredPermissionName. C'est le point important pour votre cas. –