Ваш вопрос состоит из двух частей.
Опции в ConfigObj могут быть либо строкой, либо списком строк.
[Parameters]
name = hello1 # This will be a string
pets = Fluffy, Spot # This will be a list with 2 items
town = Bismark, ND # This will also be a list of 2 items!!
alt_town = "Bismark, ND" # This will be a string
opt1 = foo, # This will be a list of 1 item (note the trailing comma)
Итак, если вы хотите, чтобы что-то отображалось в виде списка в ConfigObj, вы должны убедиться, что оно содержит запятую. Список из одного элемента должен иметь запятую.
В Python строки являются итеративными. Таким образом, даже если они не являются списком, их можно повторять. Это означает, что в выражении типа
print(", ".join(para['name']))
строка para['name']
будет перебираться, создавая список ['h', 'e', 'l', 'l', 'o', '1']
, который Python покорно объединяет вместе с пробелами, создавая
h e l l o 1
HandleErrorAttribute, который идет с MVC, является довольно основной IExceptionFilter.
У Вас есть несколько опций достигнуть того, что я думаю, что Вы хотите.
Можно или использовать [HandleError (Type=typeof(MyException), Представление = "ErrorView")] на действиях/контроллерах или реализовывать собственное
HandleErrorAttribute не очень сложен. Я думаю, что MS рекомендует, чтобы Вы скопировали этот код и изменили для удовлетворения требованиям.
Переопределение OnException предоставляет Вам доступ ко всей этой информации, в которой Вы, возможно, нуждаетесь - контроллер, действие, данные маршрутов, и т.д. - через ExceptionContext.
Не забудьте устанавливать ExceptionHandled. Затем можно установить filterContext. Результат к новому экземпляру RedirectToAction, которые перенаправляют к Вашему ErrorController и действию - очевидно, можно выставить определенный контроллер и действие со свойствами.
Почему бы не создать Ваш собственный ErrorResult, происходящий из ActionResult?
То, что я делаю (который может или не может быть хорошей практикой), является этим:
Когда ошибка происходит:
Большая часть моей универсальной обработки ошибок входит в базовый класс для всех моих контроллеров. Единственная проблема - то, что я должен вручную установить контроллер и значение действия в базовом классе так, чтобы это могло генерировать ActionLink для перенаправления на ошибочной странице.
Леппи, если вы хотите отправить результат действия, вы можете определить действие и контроллер для перенаправления при ошибке. Это хороший пример, но лично мне не нравится не использовать пользовательские страницы или http-коды для кодов
Вот и пример моего IExtenptionFilter. Мой базовый контроллер имеет IExceptionFilter по умолчанию для обработки всех неконтролируемых ошибок.
[SuppressMessage("Microsoft.Performance", "CA1813:AvoidUnsealedAttributes",
Justification = "This attribute is AllowMultiple = true and users might want to override behavior.")]
[AttributeUsage(AttributeTargets.Class | AttributeTargets.Method, Inherited = true, AllowMultiple = true)]
public class GenericExceptionHandlerFilter : ActionFilterAttribute, IExceptionFilter
{
public Type ExceptionType { get; set;}
public string RedirectToAction { get; set;}
public string RedirectToController { get; set;}
protected bool ApplyFilter(ExceptionContext filterContext)
{
Type lExceptionType = filterContext.Exception.GetType();
return (ExceptionType == null ||
lExceptionType.Equals(ExceptionType));
}
#region IExceptionFilter Members
public void OnException(ExceptionContext filterContext)
{
if (ApplyFilter(filterContext))
{
IbfControllerLogger.Log(filterContext.Exception);
filterContext.ExceptionHandled = true;
#region Calculate Action Controller Error
RouteValueDictionary lRoutes = new RouteValueDictionary(new
{
action = RedirectToAction,
controller = String.IsNullOrEmpty(RedirectToController) ? (string)filterContext.RouteData.Values["controller"] : RedirectToController
});
UrlReWriterUtils.UrlReWriter(filterContext.Controller.ViewData, lRoutes);
#endregion
filterContext.Controller.TempData[TempDataName.C_TEMPDATA_EXCEPTIONERROR] = filterContext.Exception;
filterContext.Result = new RedirectToRouteResult(lRoutes);
}
}
#endregion