放射科医生视图在您第一次进入时加载得很好,并且下拉列表中充满了数据。
选择医生后,表格应该显示视图中显示的两个值,但它们不会更新,仍然显示为“”和0。
我已经尝试了
Modelstate.Clear()
但没有成功。
我的观点(处于非常阿尔法阶段):
@inject IStringLocalizer<SharedResources> ViewLocalizer
@model RadiologistModel
@{
ViewData["Title"] = ViewLocalizer["Page.Radiologists.Title"];
}
<div class="container-fluid">
<div class="row justify-content-center">
<h1>@ViewLocalizer["Page.Radiologists.Title"]</h1>
</div>
<div class="row">
@Html.DropDownListFor(m => m.Users,
new SelectList(Model.Users, "Usuarioid", "NombreApellidos", Model.Users.First().Usuarioid),
new
{
style = "width: 250px;"
})
<table class="table">
<thead>
<tr>
<th scope="col">#</th>
<th scope="col">Nombre</th>
<th scope="col">Aparcar</th>
</tr>
</thead>
<tbody>
<tr>
<th scope="row">1</th>
<td>@Model.rad.UsuarioNombre</td>
<td>@Model.rad.CantidadPruebasAparcar</td>
</tr>
</tbody>
</table>
</div>
</div>
查看模型:
public class RadiologistModel
{
public ICollection<UsuarioDTO> Users { get; set; }
public RadiologoAparcarDTO rad { get; set; }
}
控制器:
namespace xxx
{
/// <summary>
/// Radiologists controller
/// </summary>
[Authorize]
public class RadiologistsController : BaseController
{
public RadiologistsController(IRISAPI_Client client, IStringLocalizer<SharedResources> stringLocalizer) : base(client, stringLocalizer)
{
}
public async Task<IActionResult> Index()
{
var identity = User.Identity;
if (identity != null)
{
var authToken = ((ClaimsIdentity)identity).FindFirst(ClaimTypes.Authentication)?.Value;
if (authToken != null)
{
_client.SetBearerToken(authToken);
var radiologistModel = new RadiologistModel
{
Users = await _client.UsuariosAllAsync(),
rad = new RadiologoAparcarDTO()
};
return View(radiologistModel);
}
}
return View();
}
public async Task<IActionResult> AparcarGET(int usuarioId)
{
RadiologistModel rad;
var authToken = User.Identity.GetAuthToken();
if (authToken != null)
{
_client.SetBearerToken(authToken);
var aparcar = await _client.AparcarGETAsync(usuarioId);
ModelState.Clear();
rad = new RadiologistModel
{
Users = await _client.UsuariosAllAsync(),
rad = aparcar
};
return View(rad);
}
return View();
}
public async Task<IActionResult> AparcarPUTAsync(int usuarioId, int cantidadPruebasAparcar)
{
var authToken = User.Identity.GetAuthToken();
if (authToken != null)
{
_client.SetBearerToken(authToken);
var rad2 = new GuardarRadiologoAparcarDTO
{
CantidadPruebasAparcar = cantidadPruebasAparcar
};
await _client.AparcarPUTAsync(usuarioId, rad2);
return View("Success");
}
return View();
}
}
}
jQuery:
$("#Users").on('change', function () {
var userId = $('#Users').val();
$.ajax({
type: "POST",
url: "/Radiologists/AparcarGET",
dataType: "json",
data: { usuarioId: userId },
success: function (data) {
debugger;
alert(data);
},
failure: function (data) {
alert('oops something went wrong');
}
});
});
编辑 1:我忘了提及 AparcarGET 控制器方法确实在 ddl onchange 上被调用(因为断点被击中),并且值被正确存储在视图模型中。
编辑2:Javascript错误500
我刚刚在返回 View(model) 后在控制台中检测到 jQuery 500 错误,但还不知道原因。
编辑 3:在 Firefox 上启动。
这是 Firefox 对于 500 错误的说法:
strict-origin-when-cross-origin
?控制器同源,没有任何改变!
我认为您正在对 GET 方法进行 POST 调用。 控制器方法默认是 Http Get。 您可以更改客户端调用以使用 Get 请求,这更有意义,因为您不会在此调用中更改后端的任何状态,或者通过 [HttpPost] 注释方法来更改控制器。
我也对在这个方法中返回View有疑问,可能你只需要返回一个PartialView,这将避免显示应用程序的公共布局。
500 错误大多数情况下是由于后端问题造成的。尝试调试后端代码(控制器)以检查代码是否到达您想要的位置。