模型更改后 ASP.NET MVC 视图不会更新

问题描述 投票:0回答:1

放射科医生视图在您第一次进入时加载得很好,并且下拉列表中充满了数据。

选择医生后,表格应该显示视图中显示的两个值,但它们不会更新,仍然显示为“”和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
?控制器同源,没有任何改变!

.net asp.net-mvc controller .net-6.0 viewmodel
1个回答
0
投票

我认为您正在对 GET 方法进行 POST 调用。 控制器方法默认是 Http Get。 您可以更改客户端调用以使用 Get 请求,这更有意义,因为您不会在此调用中更改后端的任何状态,或者通过 [HttpPost] 注释方法来更改控制器。

我也对在这个方法中返回View有疑问,可能你只需要返回一个PartialView,这将避免显示应用程序的公共布局。

500 错误大多数情况下是由于后端问题造成的。尝试调试后端代码(控制器)以检查代码是否到达您想要的位置。

© www.soinside.com 2019 - 2024. All rights reserved.