Как сохранить / защитить определенные поля при редактировании в ASP.NET MVC - PullRequest
5 голосов
/ 25 сентября 2011

В действии Edit в ASP.NET MVC некоторые поля могут быть скрыты от пользователя с помощью HiddenFieldFor.Однако это не защищает поля (такие как идентификатор, дата создания данных) от редактирования.

Например, у модели Student есть поля Id, Name и Birthday.Я хотел бы разрешить пользователям обновлять имя, но не идентификатор и день рождения.

Для действия редактирования, подобного этому

public ActionResult Edit(Student student)
{
    if (ModelState.IsValid)
    {
        db.Entry(student).State = EntityState.Modified;
        db.SaveChanges();
        return RedirectToAction("Index");
    }
    return View(student);
}

Как можно предотвратить редактирование идентификатора и дня рождения?Спасибо!

Ответы [ 2 ]

11 голосов
/ 25 сентября 2011

Вы должны использовать модель представления, которая содержит только те свойства, которые вы хотите отредактировать:

public class EditStudentViewModel
{
    public string Name { get; set; }
}

, а затем:

public ActionResult Edit(StudentViewModel student)
{
    ...
}

Другая методика, которую я использую не рекомендуется исключать из привязки определенные свойства:

public ActionResult Edit([Bind(Exclude = "Id,Birthday")]Student student)
{
    ...
}

или включать:

public ActionResult Edit([Bind(Include = "Name")]Student student)
{
    ...
}
1 голос
/ 25 сентября 2011

Я предполагаю, что у вас должны быть свойства в вашей модели, чтобы в представлении вы могли использовать их для отображения полезной информации, например, ActionLink с идентификатором или некоторым текстом только для чтения.

В этом случае вы можете определить вашу модель с явной привязкой:

[Bind(Include = "Name")]
public class Student
{
    int Id { get; set; }
    int Name { get; set; }
    DateTime Birthday { get; set; }
}

Таким образом, при обновлении модели, если пользователь отправляет дополнительный идентификатор, он не будет привязан.

Еще одна идея, которая мне нравится, заключается в том, чтобы ваша модель знала свои привязки для каждого сценария и проверяла их компилятором:

public class ModelExpression<T>
{
    public string GetExpressionText<TResult>(Expression<Func<T, TResult>> expression)
    {
        return ExpressionHelper.GetExpressionText(expression);
    }
}

public class Student
{
    public static string[] EditBinding = GetEditBinding().ToArray();

    int Id { get; set; }
    int Name { get; set; }
    DateTime Birthday { get; set; }

    static IEnumerable<string> GetEditBinding()
    {
        ModelExpression<Student> modelExpression = new ModelExpression<Student>();
        yield return modelExpression.GetExpressionText(s => s.Name);
    }
}

Таким образом, в вашем действии при вызове TryUpdateModel вы можете передать эту информацию.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...