Вопросы:
- Как установить значения по умолчанию для модели, когда это значение по умолчанию
основан на User.Identity.Name?
- Как вы делаете поле
только для чтения в представлении, но все равно работает так, как задумано в модели
уровень
Ниже моя попытка решить обе эти проблемы.
Справочная информация:
Каждая учетная запись может создать группу пользователей. Я хочу, чтобы владельцы Учетной записи могли создавать Пользователей, но я хочу, чтобы значение Учетной записи по умолчанию равнялось их Учетной записи (неизменяемой). Модель также будет использоваться учетными записями администраторов, которые могут установить имя учетной записи, поэтому я хочу сохранить эту переменную в модели и представлениях.
Сейчас моя модель использует необязательный параметр AccountName, чтобы я мог установить для него значение User.Identity.Name:
.
public partial class User
{
public User()
{
this.Games = new HashSet<Game>();
}
public User(string AccountName)
{
this.AccountName = AccountName;
this.Games = new HashSet<Game>();
}
[Required]
public string Name { get; set; }
[Required]
[Display(Name = "Account Name")]
public string AccountName { get; set; }
public string Rank { get; set; }
public virtual ICollection<Game> Games { get; set; }
}
Затем контроллер устанавливает значение по умолчанию для нового пользователя при создании:
// GET: /User/Create
public ActionResult Create()
{
User user = new User(User.Identity.Name);
return View(user);
}
В представлении я изменил @ Html.EditorFor на @ Html.DisplayFor, поскольку не хочу, чтобы пользователи редактировали это поле:
<div class="editor-label">
@Html.LabelFor(model => model.AccountName)
</div>
<div class="editor-field">
@Html.DisplayFor(model => model.AccountName)
@Html.ValidationMessageFor(model => model.AccountName)
</div>
Проблема в том, что AccountName является обязательным полем, поэтому, когда я пытаюсь сохранить, он выдает ошибку проверки, сообщающую, что это необходимо. Я могу легко сохранить это поле в качестве поля EditorFor и сделать его доступным только для чтения через javascript, но я хотел знать, как это должно быть сделано.