2013-04-11 2 views
0

Мне просто интересно, где, в MVC, ответственность за определение места перенаправления принадлежит. I думаю это контроллер, но я не уверен.Условное перенаправление в контроллере?

В действии Создать WorkshopItem Я создаю новый WorkshopItem из переданного ViewModel, а затем сохраняю его в базе данных. Часть ViewModel - это SelectedCustomerId и CustomerName, если SelectedCustomerId пуст и имя пусто. Я получаю объект default customer и свяжу его с элементом. Если идентификатор пуст, но имя не указано, пользователь выполнил поиск клиента, но совпадений не найдено, поэтому я беру значение и создаю новую запись клиента и присоединяю ее.

[NHibernateActionFilter] 
[HttpPost] 
public ActionResult Create(WorkshopItemCreateViewModel model) 
{ 
    try 
    { 
     Customer customer = null; 

     if (model.SelectedCustomerId == new Guid() && 
       !string.IsNullOrWhiteSpace(model.CustomerName)) 
      customer = CreateNewCustomer(model.CustomerName); 
     else if (model.SelectedCustomerId == new Guid() && 
       string.IsNullOrWhiteSpace(model.CustomerName)) 
     { 
      // Assign the System Valued customer if no customer was selected. 
      var id = Guid.Parse(ConfigurationManager.AppSettings["ValuedCustomerId"]); 
      customer = Session.QueryOver<Customer>() 
           .Where(c => c.Id == id) 
           .SingleOrDefault(); 
     } 

     // other stuff 
     return RedirectToAction("Index"); 

Это работает хорошо, но теперь я хочу также RedirectToAction в зависимости от того, была ли создана запись клиента или нет, потому что если был создан клиент имеет Name только, и я хотел бы перенаправить на Edit действие на клиентском контроллере, передающее CustomerId (что, я думаю, я могу сделать). Мой вопрос действительно в том, действительно ли это делается в MVC или это должно быть ответственным в другом месте?

Это будет выглядеть следующим образом:

[NHibernateActionFilter] 
[HttpPost] 
public ActionResult Create(WorkshopItemCreateViewModel model) 
{ 
    try 
    { 
     Customer customer = null; 
     bool newCustomer = false; 
     if (model.SelectedCustomerId == new Guid() && 
       !string.IsNullOrWhiteSpace(model.CustomerName)) 
     { 
      customer = CreateNewCustomer(model.CustomerName); 
      newCustomer = true; 
     } 
     else if (model.SelectedCustomerId == new Guid() && 
       string.IsNullOrWhiteSpace(model.CustomerName)) 
     { 
      // Assign the System Valued customer if no customer was selected. 
      var id = Guid.Parse(ConfigurationManager.AppSettings["ValuedCustomerId"]); 
      customer = Session.QueryOver<Customer>() 
           .Where(c => c.Id == id) 
           .SingleOrDefault(); 
     } 

     // other stuff 
     if (newCustomer) 
      return RedirectToAction("Edit", "Customer", new {id=customer.Id}); 
     else 
      return RedirectToAction("Index"); 

ответ

3

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

if (model.SelectedCustomerId == new Guid() && !string.IsNullOrWhiteSpace(model.CustomerName)) 
    customer = CreateNewCustomer(model.CustomerName); 
    return RedirectToAction("Edit", new {id = customer.Id}); 
else if (model.SelectedCustomerId == new Guid() && string.IsNullOrWhiteSpace(model.CustomerName)){ 
    // Assign the System Valued customer if no customer was selected. 
    var id = Guid.Parse(ConfigurationManager.AppSettings["ValuedCustomerId"]); 
    customer = Session.QueryOver<Customer>().Where(c => c.Id == id).SingleOrDefault(); 
    return RedirectToAction("SomeOtherMethod"); 

    }  
     // other stuff 
return RedirectToAction("Index"); 
Смежные вопросы