Чак Норрис
- Вопросы
- Ответы
Имя | Неизвестно |
Возраст | Неизвестно |
Сайт | Неизвестно |
Неизвестно | |
Участвует в проекте | 1103 дн., 22 час., 55 мин. |
Последняя активность | 535 дн., 7 час., 46 мин. назад |
Ответы
Перейти к вопросу →
Можно использовать excanvas. Чтобы всё заработало, достаточно включить скрипт:
<head>
<!--[if IE]><script src="excanvas.js"></script><![endif]-->
</head>
Если canvas создаётся динамически, то после создания нужно вызывать такой код:
var el = document.createElement('canvas');
G_vmlCanvasManager.initElement(el);
var ctx = el.getContext('2d');
Для ознакомления можно посмотреть примеры библиотеки flot (построение графиков на canvas), в которых используется excanvas. В IE эти примеры работают также как в остальных браузерах.
Перейти к вопросу →
Стандартный класс RedirectResult
и соответствующий метод Redirect контроллера не подойдут, потому что они осуществляют врЕменное перенаправление с кодом 302. Лучший вариант — создать собственный класс, унаследованный от ActionResult
.
public class PermanentRedirectResult : ActionResult
{
public string Location { get; set; }
public PermanentRedirectResult(string location)
{
Location = location;
}
public override void ExecuteResult(ControllerContext context)
{
context.HttpContext.Response.StatusCode = 301;
context.HttpContext.Response.RedirectLocation = Location;
context.HttpContext.Response.End();
}
}
Перейти к вопросу →
Пока единственное найденное решение — передавать с запросом дополнительное значение:
isAjax = true
И на стороне сервера использовать стандартный метод IsAjaxRequest
вместе с проверкой на наличие этого параметра:
bool IsAjaxRequest(){
return Request.IsAjaxRequest() ||
Request.Params["isAjax"] == "true";
}
Перейти к вопросу →
Я не очень много работал с WPF, но описанная вещь — это, вероятно, фишка Routed Events. Суть в том, что событие сгенерированное элементом дерева контролов может быть обработано любым другим вышестоящим элементом в иерархии. В данном случае при изменении в ComboBox
возникает событие, которое обрабатывается родительским контейнером.
Перейти к вопросу →
Метод Cookies.Remove
удаляет cookie из коллекции на сервере. Естественно, у клиента при этом всё остаётся без изменений. Чтобы удалить cookie с клиента нужно создавать новый объект HttpCookie
с тем же именем и задать Expires
в прошедшую дату:
if (Request.Cookies["Key"] != null)
{
var cookie = new HttpCookie("Key")
{
Expires = DateTime.Now.AddDays(-1d)
};
Response.Cookies.Add(cookie);
}
Перейти к вопросу →
Строку подключения можно брать из секции appSettings
файла App.config
/Web.config
. Для этого в конфигурации Fluent NHibernate нужно написать:
var config = Fluently.Configure()
.Database(
MsSqlConfiguration.MsSql2005
.ConnectionString(c => c
.FromAppSetting("MainConnectionString"))
)
.Mappings(m =>
m.FluentMappings.AddFromAssemblyOf<KidMap>())
.BuildConfiguration();
В файле App.config (или Web.config):
<configuration>
<!-- ... -->
<appSettings>
<add
key="MainConnectionString"
value="Data Source=.\SQLEXPRESS;Initial Catalog=TestDB;User Id=sa;Password=*****" />
</appSettings>
<!-- ... -->
</configuration>
Перейти к вопросу →
Есть два типа структурных элементов для композиции, которые может определить пользователь:
- User Control
- Custom Control
User Control — это часть разметки, выделенная в отдельный ascx файл. Создание и редактирование такого контрола очень похоже на создание обычных веб-страниц. Рендеринг такого контрола требует наличия ascx файла на диске. Эти контролы как туалетная бумага — не подлежат повторному использованию между проектами. Единственная возможность — скопировать файл в другой проект.
Custom Control — это класс, унаследованный от Control
или WebControl
. Такой вариант идеально подходит для повторного использования, потому что контрол является обычным классом, который может быть размещен в любой сборке. Но теряется возможность редактирования в редакторе VS.
Выводы. Если нужно повторное использование и расположение контрола в другой сборке, то лучше создать Custom Control. User Control все-таки можно расположить в другой сборке, но это требует долгих танцев с бубном.
Перейти к вопросу →
Можно использовать объект класса JavaScriptSerializer
, который включен в .NET 3.5 Sp 1 (пространство имен System.Web.Script.Serialization
, сборка System.Web.Extensions
). Этот объект преобразует строку JSON в граф объектов. Соответственно, для всей структуры JSON должны быть объявлены C#-классы с одноименными свойствами или полями. Например, имеем такой JSON:
{
"name": "category_name",
"description": "some description",
"products": [
{"name": "product1", "id": "p1"},
{"name": "product2", "id": "p2"}
]
}
Для преобразования такой строки в объекты нужно объявить классы:
public class Product
{
public string Id { get; set; }
public string Name { get; set; }
}
public class Category
{
public string Name { get; set; }
public string Description { get; set; }
public IList<Product> Products { get; set; }
}
Теперь для преобразования JSON в граф можно выполнить код:
var serializer = new JavaScriptSerializer();
var data = serializer.Deserialize<Category>(jsonString);
Перейти к вопросу →
Можно заменить имя нода прямо в тексте текущего узла. Конечно, это небезопасно, но как крайняя мера может подойти:
var currentNode = navigator.OuterXml;
currentNode = currentNode.Replace("oldNode", "newNode"); 1
navigator.ReplaceSelf(currentNode);
Для пущей безопасности в точке 1 можно использовать не глупый Replace
, а что-нибудь с регулярными выражениями.
Перейти к вопросу →
В веб-приложении можно сделать так:
var clientSection = (ClientSection) WebConfigurationManager.GetSection("system.serviceModel/client");
var endpoints = clientSection.Endpoints;
Затем из коллекции endpoins
можно достать всё, что нужно:
foreach (ChannelEndpointElement endpoint in Model)
{
var address = endpoint.Address;
var name = endpoint.Name;
// ...
}