ViewName присутствует только тогда, когда вы устанавливаете его в ViewResult. Если имя вашего View совпадает с именем вашего контроллера, то я бы проверил, чтобы ViewName было пустым или пустым, поскольку это (IMO) - правильное поведение, так как вы не хотите устанавливать имя в представлении. Я проверяю только то, что ViewName установлено, когда я предполагаю, что возвращаемое представление не соответствует действию, например, при возврате представления «Ошибка».
EDIT : ниже приведен источник для ExecuteResult в ViewResultBase.cs (из RC1 у меня нет источника для RTW на моем Macintosh). Как вы можете видеть, он проверяет, было ли ViewName установлено напрямую, а если нет, он извлекает его из действия в данных маршрута контекста контроллера. Это происходит только в ExecuteResult, который вызывается ПОСЛЕ того, как действие вашего контроллера завершено.
public override void ExecuteResult(ControllerContext context) {
if (context == null) {
throw new ArgumentNullException("context");
}
if (String.IsNullOrEmpty(ViewName)) {
ViewName = context.RouteData.GetRequiredString("action");
}
ViewEngineResult result = null;
if (View == null) {
result = FindView(context);
View = result.View;
}
ViewContext viewContext = new ViewContext(context, View, ViewData, TempData);
View.Render(viewContext, context.HttpContext.Response.Output);
if (result != null) {
result.ViewEngine.ReleaseView(context, View);
}
}