Исключить свойства при привязке модели с помощью интерфейсов - PullRequest
3 голосов
/ 16 декабря 2010

Это пример, который я поднял здесь: http://aspalliance.com/1776_ASPNET_MVC_Beta_Released.5

public ActionResult Save(int id)
{
 Person person = GetPersonFromDatabase(id);
 try
 {
  UpdateMode<IPersonFormBindable>(person)
  SavePersonToDatabase(person);

  return RedirectToAction("Browse");
 }
 catch
 {
  return View(person)
 }
}

interface IPersonFormBindable
{
 string Name  {get; set;}
 int Age   {get; set;}
 string Email {get; set;}
}

public class Person : IBindable
{
 public string Name   {get; set;}
 public int Age    {get; set;}
 public string Email {get; set;}
 public Decimal? Salary  {get; set;}
}

Это не будет сопоставлять значения со свойством Salary, но выполнит его атрибуты проверки, которые не ожидаются при выполнении стандарта [Bind (Exclude = "Salary")]

[Bind(Exclude="Salary")]
public class Person
{
 public string Name  {get; set;}
 public int Age   {get; set;}
 public stiring Email {get; set;}
 public Decimal? Salary  {get; set;}
}

Как мне реализовать [Bind (Exclude = "Property")] , используя этот шаблон интерфейса?

1 Ответ

2 голосов
/ 18 декабря 2010

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

public class PersonViewModel
{
    public string Id { get; set; }
    public string Name { get; set; }
    public int Age { get; set; }
    public string Email { get; set; }
}

И ваш контроллер действия:

public ActionResult Save(PersonViewModel person)
{
    _repository.SavePersonToDatabase(person);
    return RedirectToAction("Browse");

    // Notice how I've explicitly dropped the try/catch,
    // you weren't doing anything meaningful with the exception anyways.
    // I would simply leave the exception propagate. If there's 
    // a problem with the database it would be better to redirect 
    // the user to a 500.htm page telling him that something went wrong.
}

Если в другом действии вам нужна зарплата, напишите другую модель представления, специфичную для этого представления. Не беспокойтесь, если вы повторите некоторые свойства между вашими моделями представления. Это именно то, для чего они предназначены. Очевидно, ваш репозиторий будет работать с моделью, а не с моделью. Так что вам нужно будет сопоставить эти два типа. Я бы порекомендовал вам использовать AutoMapper для этой цели.

Это моя точка зрения: всегда пишите модели представлений, специально адаптированные к потребностям данного представления. Старайтесь избегать таких параметров, как «Включить», «Исключить», иначе однажды вас укусят, кто-то собирается добавить какое-либо конфиденциальное свойство и забудет добавить его в список «Исключить». И даже если вы использовали функцию «Включить», она по-прежнему ужасна.

...