Лучшая практика для защиты модели после публикации в MVC3 - PullRequest
2 голосов
/ 07 марта 2012

Какова лучшая практика для защиты модели от нежелательного анализа / обновления после публикации в MVC3

Действие контроллера вызывается в HttpGet-> Product / Edit:

 public ActionResult Edit()
        {
          Product p = new Product();
          p.Id = 1;
          p.Name = "PC";
          Category cat = new Category();
          cat.Id = 1;
          cat.Name = "Non food";
          p.Category = cat;

          return View(p);
        }

Это редактированиеПредставление:

@model MvcApplication3.Models.Product
@using (Html.BeginForm("Edit", "Product", FormMethod.Post))
{
  @Html.HiddenFor(model => model.Id)
  @Html.EditorFor(model => model.Name)
  <input type="submit" value="Submit" name="go" />
}

После того, как браузер получит ответ, пользователь вставляет на страницу следующий html-сегмент:

<input type="text" value="5" name="Category.Id" id="Category_Id"/>

Он публикует форму, и следующее действие контроллера получаетПараметр «Product».

    //
    // POST: /Class1/Edit/5

    [HttpPost]
    public ActionResult Edit(Product p)
    {
      //Here: p.Company.Id is 5    !!!
      db.Save(p);
      return null;
    }

Проблема в том, что пользователю не разрешается публиковать / обновлять c.Company.Id.Я не хотел бы проверять всю структуру параметров поиска нежелательных значений.Я ищу лучшую практику для решения этой проблемы.

Любая помощь приветствуется!

Bests,

Boolish

Ответы [ 2 ]

1 голос
/ 07 марта 2012

Вот почему вы должны использовать модели представлений, а не сущности БД в ваших представлениях

http://blog.gauffin.org/2011/07/three-reasons-to-why-you-should-use-view-models/

1 голос
/ 07 марта 2012

Вы можете отделить полученный тип объекта (то есть ViewModel) от типа объекта, сохраненного в базе данных, как описано в этом недавнем сообщении в блоге Джоша Буша. Также стоит прочитать - актуально, так как это связано с недавней похожей проблемой, с которой столкнулся GitHub.

например.

public ActionResult Edit(ProductModel p)
{
    // Map ProductModel -> a Product instance
    // Then save
}
...