Привязка данных: «System.String» не содержит свойство с именем «Имя» - PullRequest
0 голосов
/ 26 мая 2019

Я работаю с пользовательской аутентификацией с asp.net mvc, я использую Role Provider.У меня есть много ко многим отношения пользователя, роли, UserInRoles.ошибка в значениях ролей привязки в представлении

я попытался отладить метод создания контроллера, он возвращает все данные в таблице ролей, а затем продолжает просматривать в foreach

ошибка DataBinding: 'System.Строка 'не содержит свойства с именем' Имя '.

Модель пользователя

public class User
    {
        [Key]
        public string  UserId { get; set; }
        public string Name { get; set; }
        public virtual ICollection<UserInRoles> UserInRoles { get; set; }

    }

Ролевая модель

public class Role
    {
        public int RoleId { get; set; }
        public string Name { get; set; }
        public virtual ICollection<UserInRoles> UserInRoles { get; set; }


    }

Модель UserInRole

 public class UserInRoles
    {
        [Key, Column(Order = 0)]
        public string UserId { get; set; }
        [Key, Column(Order = 1)]
        public int RoleId { get; set; }
        public virtual User User { get; set; }
        public virtual Role Role { get; set; }

    }

Контроллер

public ActionResult Create()
        {
            ViewBag.RoleId = new SelectList(Roles.GetAllRoles().ToList(), "Name", "Name");
            return View();
        }

Просмотр

@model AramexOneKnowledge.Models.RegisterViewModel
@{
    ViewBag.Title = "Create";
}
<h2>Create</h2>

@using (Html.BeginForm()) 
{
    @Html.AntiForgeryToken()

<div class="form-horizontal">
    <h4>User</h4>
    <hr />
    @Html.ValidationSummary(true, "", new { @class = "text-danger" })
    <div class="form-group">
        @Html.LabelFor(model => model.UserId, htmlAttributes: new { @class = "control-label col-md-2" })
        <div class="col-md-10">
            @Html.EditorFor(model => model.UserId, new { htmlAttributes = new { @class = "form-control" } })
            @Html.ValidationMessageFor(model => model.UserId, "", new { @class = "text-danger" })
        </div>
    </div>

    <div class="form-group">
        @Html.LabelFor(model => model.Name, htmlAttributes: new { @class = "control-label col-md-2" })
        <div class="col-md-10">
            @Html.EditorFor(model => model.Name, new { htmlAttributes = new { @class = "form-control" } })
            @Html.ValidationMessageFor(model => model.Name, "", new { @class = "text-danger" })
        </div>
    </div>
    <div class="form-group">
        <label class="col-md-2 control-label">
            Select User Role
        </label>
        <div class="col-md-10">
            @foreach (var item in (SelectList)ViewBag.RoleId)
            {
                <input type="checkbox" name="SelectedRoles"
                       value="@item.Value" class="checkbox-inline" />
                @Html.Label(item.Value, new { @class = "control-label" })
            }
        </div>
    </div>
    <div class="form-group">
        <div class="col-md-offset-2 col-md-10">
            <input type="submit" value="Create" class="btn btn-primary" />
        </div>
    </div>

ожидаемый результат отображения ролей в флажке

1 Ответ

1 голос
/ 26 мая 2019

это исключение, потому что Roles.GetAllRoles() возвращает string[], и вы пытаетесь связать свойство Name внутри него, которого оно не существует.

, поэтому для преодоления этой проблемы вы можете заполнить свой список флажков следующим образом

ViewBag.RoleId = Roles.GetAllRoles().Select(r => new SelectListItem{Text = r, Value = r});

в этом случае вы SelectListItem Value и Text это будет имя роли для них обоих

...