MVC (вопрос новичка): Как установить значение по умолчанию для представления во время действия «Создать»? - PullRequest
0 голосов
/ 26 июля 2011

Вопросы:

  1. Как установить значения по умолчанию для модели, когда это значение по умолчанию основан на User.Identity.Name?
  2. Как вы делаете поле только для чтения в представлении, но все равно работает так, как задумано в модели уровень

Ниже моя попытка решить обе эти проблемы.

Справочная информация:

Каждая учетная запись может создать группу пользователей. Я хочу, чтобы владельцы Учетной записи могли создавать Пользователей, но я хочу, чтобы значение Учетной записи по умолчанию равнялось их Учетной записи (неизменяемой). Модель также будет использоваться учетными записями администраторов, которые могут установить имя учетной записи, поэтому я хочу сохранить эту переменную в модели и представлениях.

Сейчас моя модель использует необязательный параметр 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, но я хотел знать, как это должно быть сделано.

1 Ответ

1 голос
/ 26 июля 2011

Вот пара мыслей:

  1. Действительно ли AccountName требуется пользователю?Я бы сказал, что это не так, поскольку вы устанавливаете его в своем контроллере.Таким образом удалите атрибут [Required] и добавьте User user = new User (User.Identity.Name);к методу действия, который обрабатывает POST и решает эту проблему.В качестве альтернативы вы можете использовать @ Html.HiddenFor (x => x.AccountName), но это делает вас уязвимым для кого-то, кто изменяет значение с помощью firebug или другого инструмента.В этом случае вы можете зашифровать / расшифровать значение, но, кажется, проще просто установить его вручную в методе post, и вам не нужно слишком беспокоиться о безопасности того, кто злонамеренно изменяет значение.

  2. Для отображения значения вы можете просто использовать @ Model.AccountName, а не лямбда

    [HttpPost]
    public ActionResult Create(User model)
    {
        if(!ModeState.IsValid)
             return View(model);
    
        model.AccountName = User.Identity.Name;  //Probably want to do some check to make sure this isn't null;
    
        // Create User in the system here...        
        return View(); // Send them to another page 
     }
    
...