Maybe I misunderstood something, but I find it strange that you want to provide information related to presentation concerns to the services. IMO, it is a very bad idea to do that as services are business logic and should not depend on presentation layer.
I don't really like neither of approaches you suggested as it seems to me that they blur the line between presentation and services.
As an example, a service should throw if it can't find the user, and the controller should then handle this error with appropriate UI mechanism: an error message, HTTP error or whatever fits your app. Similarly, how can the service know where to redirect? It is aware of GUI? How do you plan to use it in other contexts (API, non-web GUI, whatever)?
What I usually do is create a command/dto based on form/parameters and provide that to service. Then any service client can use the same command. If I need to show data, I ask services/repos for whatever I need, and map that to presentation form (if needed) and put that into ViewData/TempData/Model/Whatever.
Here are some examples (treat it as pseudo-code):
[HttpPost]
public ActionResult ChangeUserInfo(UserInfoModel model)
{
var cmd = new ChangeUserInfoCommand(CurrentUserId, model.FirstName, model.LastName);
try {
userSvc.UpdateUser(cmd);
return RedirectToAction(...);
}
catch(XxxxException e) { // e.g. something wrong (business logic)
TempData["Error"] = "an error occurred: " + e.FriendlyError();
return RedirectToAction(...); // error action
}
catch(SecurityException e) {
throw new HttpException(404, "NotFound");
}
}
public ActionResult ShowUsers()
{
var userInfo = svc.GetUsers().Select(u => { Id = u.id, FullName = u.First + " " + u.Last);
// or var userInfo = svc.GetUsers().Select(u => Mapper.To<UserDTO>(u));
return View(userInfo);
// or without model
// ViewData["users"] = userInfo;
// return View();
}
Please note that this is an illustration - I usually do it quite differently, but I have a lot of other infrastructure in place (e.g. I don't explicitly handle exceptions like this, my services sometimes have only one method Execute(IEnumerable<Command> cmds)
, I have nice support for anonymous classes as view models, etc)