Синтаксис MVC Razor

Серверный код начинается с @ .
Если выражение в одно строку можно использовать:

@someVariable


Если в несколько строк в которых используется серверный код – тогда:

@{Int someVariable = 5;<div>@someVariable</div>}


Еще есть комплексные выражения:

@ ("Какой-то текст " + someVariable)

MVC вывод HTML кода в страницу

Для того чтобы вывести HTML код в страницу из переменной ( например из базы или т.п.) нужно использовать команду @Html.Raw()
Например:

@Html.Raw("<h1>Привет</h1>")


Или:

@{string s = "<h1>Привет</h1>"}
@Html.Raw(s)

C# wpf настройка формата даты для приложения

Например: 

CultureInfo ci = new CultureInfo("ru-RU");
Thread.CurrentThread.CurrentCulture = ci;
Thread.CurrentThread.CurrentUICulture = ci;

А чтобы получить культуру:

var culture = new CultureInfo
(Thread.CurrentThread.CurrentUICulture.TwoLetterISOLanguageName);

Или можно сделать так:

public MainWindow()
{
InitializeComponent();
this.Language = XmlLanguage.GetLanguage(
CultureInfo.CurrentCulture.IetfLanguageTag);
}

MVC Ajax Browser History

Когда вы используете Ajax вызовы то после того как вы воспользуетесь кнопкой «назад» в браузере – то скорее всего получите неприятную ошибку, связанную с тем что барузер запомнил путь для вызова ajax.

[HttpPost]
public ActionResult AjaxResult()
{
if (this.Request.IsAjaxRequest()) return PartialView("AjaxTestView");
return View("TestView");
}

MVC AJAX – с чего начать

Для начала нам нужны скрипты:

<script src="~/Scripts/jquery-1.8.2.min.js"></script>
<script src="~/Scripts/jquery.unobtrusive-ajax.min.js"></script>

 Для того чтобы это все заработало нам нужна Ajax форма:

@using (Ajax.BeginForm("ActionName", new AjaxOptions
{
HttpMethod = "POST",
InsertionMode = InsertionMode.Replace,
UpdateTargetId = "ajaxDiv",
}))
{           
<div id="ajaxDiv">
@{Html.RenderPartial("~/Views/News/Control.cshtml", new Model.TestModel(true));}
</div>
}

Немного подробнее. Я использую имя действия – которое мне возвращает сформированный Partial View. В AjaxOption я указываю HttpMetod, InsertionMode – это способ вставки, можно заменить, добавить в начало, и в конец блока, UpdateTargetId – это имя контейнера в котором должны быть отображены данные. В самом теле формы нужно разместить контрол который будет вызывать submit формы. В моем случае я перегружаю полностью весь контрол, методами вызванными из самого контрола, по этому я его и разместил в форме.
Можно сделать и так:

 

@using (Ajax.BeginForm("GetData", new AjaxOptions
{
HttpMethod = "POST",
InsertionMode = InsertionMode.Replace,
UpdateTargetId = "ajaxDiv",
}))
{           
<input type="submit" value="Загрузить" />
}
<div id="ajaxDiv">
@{Html.RenderPartial("~/Views/News/Control.cshtml", new Model.TestModel(true));}
</div>

 В контроллере для Ajax у меня есть Action:

[HttpPost]
public ActionResult GetData()
{
Model.TestModel model = new Model.TestModel();
return PartialView ("~/Views/News/Control.cshtml", model);
}

В моем случае он возвращает Partial View который и записывается в div – "ajaxDiv"

 

А что делать если нужно передавать параметры? Для этого нужно указать их в параметре routeValues:

@Ajax.ActionLink(, "MonuthChange", 
new { Param1 = Model.Param1, Param2 = Model.Param2 }, new AjaxOptions
{
HttpMethod = "POST",
InsertionMode = InsertionMode.Replace,
UpdateTargetId = "calendar"
}, new { @class = "active" })

 А в контроллере:

public ActionResult GetData(string Param1, int Param2)
{
Model.TestModel model = new Model.TestModel();
return PartialView ("~/Views/News/Control.cshtml", model);
}

 Интересный момент, чтобы контролы могли отправить Ajax форму или запрос, нужно использовать котролы не из @Html а из @Ajax.

MVC как добавить к контролам Html свойства через htmlAttributes

Для этого нужно сделать новый объект и задать нужные атрибуты через htmlAttributes, главное перед именем атрибута поставить @.

Если есть routeValues:

@Html.ActionLink("linkText","ActionName", 
new {RouteValues = 1},new {@class = "Active"})

 

А если routeValues не нужны можно сделать так:

@Html.ActionLink("linkText","ActionName", 
FormMethod.Post,new {@class = "Active"})

Счетчики производительности PerformanceCounter в C#

Важное замечание, чтобы счетчики давали правдивые результаты их нужно объявить один раз и после этого к ним обращаться скажем по таймеру. Если вы будете постоянно создавать заново счетчики то они будут возвращать значение – 0. Так как им нужно время для сбора данных.
Я приведу пример четырех счетчиков: Процессора, памяти, файла подкачки и сети.

 

public partial class MainWindow : Window
{
PerformanceCounter cpuUsage;
PerformanceCounter memUsage;
PerformanceCounter pageUsage;
List<PerformanceCounter> netUsage = null;
System.Timers.Timer tmr;
public MainWindow()
{
InitializeComponent();
cpuUsage = new PerformanceCounter("Processor", "% Processor Time", "_Total");
memUsage = new PerformanceCounter("Memory", "Available MBytes");
netUsage = GetNetCounters();
pageUsage = new PerformanceCounter("Paging File", "% Usage", "_Total");
tmr = new System.Timers.Timer();
tmr.Elapsed += tmr_Elapsed;
tmr.Interval = 1000;
tmr.Start();
}
void tmr_Elapsed(object sender, System.Timers.ElapsedEventArgs e)
{
Dispatcher.BeginInvoke(new ThreadStart(delegate
{
cont.Children.Clear();
cont.Children.Add(new Label() { Content = "Processor " + cpuUsage.NextValue()+ " %" });
cont.Children.Add(new Label() { Content = "memory free  " + memUsage.NextValue() +" mb"});
//добавить System.Management
string Query = "SELECT MaxCapacity FROM Win32_PhysicalMemoryArray";
ManagementObjectSearcher searcher = new ManagementObjectSearcher(Query);
foreach (ManagementObject WniPART in searcher.Get())
{
UInt32 SizeinKB = Convert.ToUInt32(WniPART.Properties["MaxCapacity"].Value);
UInt32 SizeinMB = SizeinKB / 1024;
UInt32 SizeinGB = SizeinMB / 1024;
cont.Children.Add(new Label() { Content = "memory " + ((memUsage.NextValue() / SizeinMB)*100)+"% used" });
cont.Children.Add(new Label() { Content = "memory used " + (SizeinMB - memUsage.NextValue())});
cont.Children.Add(new Label() { Content = "page used " + pageUsage.NextValue() });
foreach (var item in netUsage)
{
cont.Children.Add(new Label() { Content = "network  " + item.NextValue() });
}
}
}));
}
private List<PerformanceCounter> GetNetCounters()
{
string filter = "MS TCP Loopback interface";
List<string> nics = new List<string>();
PerformanceCounterCategory category = new PerformanceCounterCategory("Network Interface", System.Environment.MachineName);
if (category.GetInstanceNames() != null)
{
foreach (string nic in category.GetInstanceNames())
{
if (!nic.Equals(filter, StringComparison.InvariantCultureIgnoreCase))
{ nics.Add(nic); }
}
List<PerformanceCounter> nicCounters = new List<PerformanceCounter>();
foreach (string nicInstance in nics)
{
nicCounters.Add(new PerformanceCounter("Network Interface", "Bytes Total/sec", nicInstance, System.Environment.MachineName));
}
return nicCounters;
}
else
{
return null;
}
}
}

Счетчики использую стандартные системные счетчики с которых они и берут данные.

Подробнее о счетчиках:

http://msdn.microsoft.com/en-us/library/ms998581.aspx

http://technet.microsoft.com/en-us/library/cc938593.aspx

http://blogs.msdn.com...setting-up-performance-counters-in-your-web-and-worker-roles.aspx