MVC валидация привязана к полномочиям со ссылкой на другие объекты - PullRequest
0 голосов
/ 17 августа 2011

Привет, только что подумал о сопоставлении и привязке моей сущности в контроллере.Как правильно связать сущность в модели, чтобы я мог использовать modelstate

Я создаю новый MenuItem, используя MenuItemModel.

public class MenuItemModel
{
    public List<SelectListItem> Menus { get; set; }
    public MenuItem MenuItem { get; set; }
}

, где мой класс MenuItem определяется следующим образом:

public class MenuItem:Entity
{

    public virtual int MenuItemId { get; set; }
    public virtual Menu Menu { get; set; }
    [Required]
    public virtual string Name { get; set; }
    public virtual int ItemOrder { get; set; }
    public virtual string ExternalUrl { get; set; }
    public virtual DateTime Created { get; set; }
    public virtual bool Deleted { get; set; }
    public virtual DateTime? DisplayUntil { get; set; }
    public virtual User Author { get; set; }

}

теперь, когда я связываю свою сущность в контроллере.

    //
    // POST: /Administrator/MenuItem/Create

    [HttpPost]
    public ActionResult Create(MenuItem menuItem)
    {
        if (ModelState.IsValid)
        {
            // do saving logic
        menuItem.Created = DateTime.Now;
        menuItem.Author = this._userProvider.GetCurrentUser();
        menuItem.Menu = _menuRepository.Load(menuItem.Menu.MenuId);

        }
        //restore
        MenuItemModel menuItemModel = new MenuItemModel();
        menuItemModel.MenuItem = menuItem;
        menuItemModel.Menus =
            this._menuRepository.All.Select(x => new SelectListItem() { Text = x.Name, Value = x.MenuId.ToString() }).ToList();

        return View(menuItemModel);
    }

единственная проблема в том, что я получаю подтверждение не только для MenuItem, но и для Menu, User.

Как установить эту проверку для принятия проверки только для объекта MenuItem?

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

Любая идея приветствуется.

1 Ответ

2 голосов
/ 19 августа 2011

Как настроить эту проверку на принятие проверки только для объекта MenuItem?

Вам следует использовать модель представления, которая содержит только те свойства, которые необходимы для проверки в действии вашего контроллера (обычно это свойства, содержащиеся в форме и введенные пользователем). Модели представлений - это классы, специально разработанные для требований данного представления. Действие контроллера никогда не должно передавать / принимать модель домена в / из представления. Действие контроллера всегда должно передавать / принимать модель представления в / из представления. Например:

public class MenuItemViewModel
{
    public int MenuItemId { get; set; }

    [Required]
    public string Name { get; set; }

    ... put any properties that are contained on the form with their
        respective validation
}

тогда ваш контроллер POST примет эту модель представления в качестве аргумента:

[HttpPost]
public ActionResult Create(MenuItemViewModel viewModel)
{
    if (!ModelState.IsValid)
    {
        // there were some validation errors => redisplay the view
        // so that the user can fix them
        return View(viewModel);
    }

    // at this stage validation went fine
    // TODO: map the view model back to a domain model 
    // (MenutItem or whatever you are willing to update)
    // I would recommend you AutoMapper for this task: http://automapper.codeplex.com/

    // TODO: once you get the domain model pass it to a service layer
    // method in order to perform the necessary business operation with it
    // (in your case creating a menu item)

    return RedirectToAction("Success");
}
...