首页 > 解决方案 > .NET Core View 属性名称与模型属性名称不同

问题描述

我有一个 ajax 函数,当服务器端发生错误时,它会向字段返回错误消息。

这就是我显示错误的方式:

$.each(result.errors, function (index, item) {
    // Get message placeholder
    var element = $('[data-valmsg-for="' + item.propertyName + '"]');
    element.empty();
    // Update message
    element.append($('<span></span>').text(item.errorMessage));
    // Update class names
    element.removeClass('field-validation-valid').addClass('field-validation-error');
    $('#' + item.propertyName).removeClass('valid').addClass('input-validation-error');
});

这应该读取返回的属性名称,即我的字段名称并在其上显示消息。

这是领域。这是一个下拉列表

<div class="row">
    <div class="col-sm-12">
        <div class="form-group">
            @Html.HiddenFor(m => m.UserId)
            @Html.DropDownListFor(m => m.BranchDropdownListViewModel.BranchId, Model.BranchDropdownListViewModel.Branch, "Select Branch", new { @class = "form-control" })
            @Html.ValidationMessageFor(m => m.BranchDropdownListViewModel.BranchId)
        </div>
    </div>
</div>

当我检查代码时,这个下拉列表的名称是 BranchDropdownListViewModel.BranchId

但是,在我的控制器中,当我尝试查找此字段的名称时,如下所示:

ModelState.AddModelError(nameof(Input.BranchDropdownListViewModel.BranchId), "Branch already exists");

它仅将 BranchId 显示为字段的名称。

这是模型:

public class UserBranchDetailsViewModel
{
    public string Id { get; set; }
    public string UserId { get; set; }
    public string TenantId { get; set; }
    public BranchDropdownListViewModel BranchDropdownListViewModel { get; set; }
}

public class BranchDropdownListViewModel
{
    [Required]
    [Display(Name = "Branch")]
    public string BranchId { get; set; }
    public IEnumerable<SelectListItem> Branch { get; set; }
}

如何匹配控制器视图中显示的名称?我必须手动完成吗?

标签: c#asp.net-core.net-core

解决方案


使用 nameof 只会产生属性名称的最后一部分,在您的情况下是BranchId.

由于注射HtmlHelper不是那么简单,我建议你这样做

ModelState.AddModelError($"{nameof(Input.BranchDropdownListViewModel)}.{nameof(Input.BranchDropdownListViewModel.BranchId)}", "Branch already exists");

但是如果你真的想用的话HtmlHelper,看看这个方法 HtmlHelper.NameFor()


推荐阅读