Показаны сообщения с ярлыком ASP.NET MVC. Показать все сообщения
Показаны сообщения с ярлыком ASP.NET MVC. Показать все сообщения

ASP.NET MVC: как избавиться от папки Shared

вторник, 26 мая 2009 г.,

Если в Visual Studio 2008 создать ASP.NET MVC Web Application, то окажется, что в корне сайта есть папка Views, в которой есть папка Shared со следующими файлами: Site.Master, Error.aspx и LogOnUserControl.ascx;
Например, если удалить папку Shared, а файл Site.Master поместить в папку Views, то в рантайме получим сообщение об ошибке:
System.InvalidOperationException was unhandled by user code, Message="The view 'Index' or its master could not be found. The following locations were searched: ~/Views/Home/Index.aspx, ~/Views/Home/Index.ascx, ~/Views/Shared/Index.aspx, ~/Views/Shared/Index.ascx", Source="System.Web.Mvc"
Это можно исправить, если указать путь к файлам. Для этого в метод AppInitialize или в файл Global.asax.cs в метод Application_Start надо добавить следующий код:
ViewEngines.Engines.Clear();
ViewEngines.Engines.Add(new WebFormViewEngine
{
    MasterLocationFormats = new string[]
        {
            "~/Views/{0}.master",
        },
    ViewLocationFormats = new string[]
        {
            "~/Views/{0}.ascx",
            "~/Views/{0}.aspx",
            "~/Views/{1}/{0}.aspx",
            "~/Views/{1}/{0}.ascx",
        },
    PartialViewLocationFormats = new string[]
        {
            "~/Views/{0}.aspx",
            "~/Views/{0}.ascx",
            "~/Views/{1}/{0}.ascx",
        }
});
А также:
1) во всех aspx-файлах в атрибуте MasterPageFile надо в значении "~/Views/Shared/Site.Master" удалить Shared
2) в файле Site.Master в теге link в атрибуте href надо удалить начальный "../".

Как добавить роут в существующий сайт ASP.NET MVC

понедельник, 25 мая 2009 г.,

В ASP.NET MVC проекте добавление роутов происходит в Global.asax.cs, который после компиляции проекта становится недоступен. Если при этом надо добавить свой роут, то это можно сделать в так называемом well-known методе AppInitialize.
Для этого: 1) в корень сайта добавить папку App_Code 2) создать cs файл, например, AppStart.cs со следующим кодом:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Hosting;

public class Start
{
    public static void AppInitialize()
    {
        // здесь добавляем свой роут в System.Web.Routing.RouteTable.Routes
    }
}
Добавленный роут будет выше остальных, т.е. можно перехватывать все запросы, например, так:
routes.MapRoute("Default",
    "{*request}",
    new { Controller = "Site", Action = "Test" }
    );
Все запросы попадут в метод Test, определенный в классе SiteController.
using System;
using System.ComponentModel;
using System.Web.Mvc;

namespace Site
{
    [HandleError]
    public class SiteController : Controller
    {
        public ActionResult Test(string request)
        {
             return View();
        }
    }
}

Хостинг ASP.NET MVC проектов

среда, 20 мая 2009 г.,

На parking.ru взял пробный хостинг (предоставляется на 14 дней). В Visual Studio 2008 создал ASP.NET MVC Web Application. Откомпилировал проект и в главном меню выбрал "Build - Publish ...".
Попытка открыть в браузере главную страницу сайта заканчивается сообщением: Server Error in '/' Application. Оказывается, на хостинг в папку /bin надо добавить файл System.Web.Mvc.dll (находится в папке C:\Program Files\Microsoft ASP.NET\ASP.NET MVC 1.0\Assemblies\), а также в Visual Studio в Solution Explorer стать на References - System.Web.Mvc и в свойствах указать Copy Local = true.
Первая страница сайта пришла. Но теперь линки возвращают: Server Error, 404 - File or directory not found.
Звонили в паркинг. Они сказали, что надо подключиться к сайту через IIS 7.0 Manager и что-то где-то включить. Позже все включили сами. Что включили? Возможно, что-то изменили в Handler Mappings.

ASP.NET MVC Routing: с чего начать

вторник, 19 мая 2009 г.,

ASP.NET MVC Framework (Part 2): URL Routing (блог Scott Guthrie) -- статья с примерами.
ASP.NET MVC Routing Overview (C#) -- tutorial, Stephen Walther.
ASP.NET Routing Debugger (блог Phil Haack) -- сборка с дебагером, описание работы, исходники и примеры.

Для использования дебагера надо: 1) поместить RouteDebug.dll в /bin 2) добавить ссылку на сборку в References 3) в Global.asax.cs в метод Application_Start() добавить строку
RouteDebug.RouteDebugger.RewriteRoutesForTesting(RouteTable.Routes);

ASP.NET MVC лучше ASP.NET

понедельник, 18 мая 2009 г.,

ASP.NET развивает привычку использовать контролы. Чтобы вывести несколько строк на страницу надо взять, например, asp:repeater и указать для него источник данных. Если надо вывести "полосатую" таблицу, то в репитере существуют соответствующие шаблоны.
Все к этому привыкли.
Но старые привычки мешают при разработке в ASP.NET MVC. Если надо вывести список, то в ascx или aspx проще сделать так:
<%
    foreach (var item in this.Model.Items)
    {
%>
<div class="item">
        <%= item.Name %>
</div>
<%
    }
%>

Использование JQuery в Silverlight

воскресенье, 26 апреля 2009 г.,

Вместе с ASP.NET MVC поставляется JQuery (краткое описание).
Предположим, что Silverlight-приложение используется на одной из страниц ASP.NET MVC проекта, на которой есть вызов JQuery. Т.е. в html-коде страницы в head указан тег:
<script type="text/javascript" src="Scripts/jquery-1.3.2.min.js"></script>
Требуется получить границы тега button:
<button id="btn">test</button>
Решение: использовать JQuery-функцию offset.
Для этого в Silverlight-приложение надо добавить следующий extension method:
public static class JQueryHelper
{
    public static Rect GetBounds(this HtmlElement el)
    {
        ScriptObject jqo = HtmlPage.Window.CreateInstance("$", new[] { el });
        return GetBounds(jqo);
    }

    private static Rect GetBounds(ScriptObject jqo)
    {
        ScriptObject res = (ScriptObject)jqo.Invoke("offset");
        return new Rect(
            (double)res.GetProperty("left"),
            (double)res.GetProperty("top"),
            (double)jqo.Invoke("width"),
            (double)jqo.Invoke("height")
        );
    }
}
Координаты кнопки можно получить следующим образом:
Rect rect = HtmlPage.Document.GetElementById("btn").GetBounds();
System.Diagnostics.Debug.WriteLine(rect);

Could not load assembly System.Web.Abstractions

пятница, 24 апреля 2009 г.,

При запуске ASP.NET MVC проекта (кажется после установки Code Contracts) получил сообщение:
Server Error in '/' Application. Configuration Error. Description: An error occurred during the processing of a configuration file required to service this request. Please review the specific error details below and modify your configuration file appropriately. Parser Error Message: Could not load file or assembly 'System.Web.Abstractions...'.
В web.config у System.Web.Abstractions обнаружил Version=0.0.0.0, а также System.Web.Mvc не оказалось на месте ... - мистика :)
В итоге, содержимое web.config заменил на взятое из нового проекта, и все заработало.
А еще не помешает: в контекстном меню Solution'а выбрать Clean Solution, и затем Rebuild Solution.

Витрина конференции ReMIX09

среда, 8 апреля 2009 г.,

На сайте конференции Microsoft ReMIX09 открыта витрина (showcase) -- работает на основе KiGG (исходники на C# доступны в разделе Releases; построен на ASP.NET MVC).

После распаковки .zip-архива надо открыть Microsoft SQL Server Management Studio, подключиться к .\SQLEXPRESS, открыть файл \KiGG-v2.2\Database\Create.sql, нажать F5. Тоже самое сделать для файла \KiGG-v2.2\Database\Data.sql

В результате в .\SQLEXPRESS будет создана база данных KiGG. Файлы БД: KiGG.mdf и KiGG_log.LDF находятся в папке C:\Program Files\Microsoft SQL Server\MSSQL.1\MSSQL\DATA.

Для запуска сайта надо: 1) открыть \KiGG-v2.2\Kigg.sln 2) в файле Web.config вместо "Data Source=.\SQLEXPRESS;AttachDbFileName=|DataDirectory|Kigg.mdf;Integrated Security=True;User Instance=True;MultipleActiveResultSets=true" указать "Data Source=.\SQLEXPRESS;Initial Catalog=KiGG;Integrated Security=True;MultipleActiveResultSets=true" 3) в контекстном меню Kigg.Web\App_Data выбрать Add - Existing Item... - KiGG.mdf; в App_Data должен появиться нод KiGG.mdf с потомком Kigg_log.LDF 4) нажать F5

Внимание: менять Web.config не требуется, если файлы БД поместить в папку App_Data.
Для этого: 1) в Microsoft SQL Server Management Studio в контекстном меню KiGG выбрать Tasks - Detach..., нажать OK 2) перенести файлы БД из папки C:\Program Files\Microsoft SQL Server\MSSQL.1\MSSQL\DATA в папку \KiGG-v2.2\Web\App_Data

P.S.
Маршруты (routes) регистрируются в \KiGG-v2.2\Web\BootstrapperTasks\RegisterRoutes.cs, метод Execute.
Контроллеры находятся в папке \KiGG-v2.2\Web\Controllers. Например, для следующего роута: _routes.MapRoute("Faq", "Faq", new { controller = "Support", action = "Faq" });, контроллер - это класс SupportController (определен в файле \KiGG-v2.2\Web\Controllers\SupportController.cs)

ASP.NET MVC 1.0

четверг, 19 марта 2009 г.,

Был ASP.NET MVC RC2, а теперь ASP.NET MVC 1.0, то есть вышел / зарелизен. Это радует. Но при установке возможна проблема: в окне Installing Microsoft ASP.NET MVC 1.0 Setup, в момент отображения "Status: Configuring MVC templates for Visual Studio" всплывает диалог:

There is a problem with this Windows installer package. A program run as part ot the setup did not finish as expected. Contact your support personnel or package vendor.

Решение: открыть Control Panel\Programs\Programs and Features и для Spec# вызвать Uninstall. Возможно, что F# также придется деинсталлировать.

Другие попытки, такие как:
  1. очистка реестра
  2. переустановка Visual Studio
  3. изучения файла С:\Users\имя_пользователя\AppData\Local\Temp\MvcTemplates.Log - создает установщик ASP.NET MVC 1.0
  4. вызов msiexec /i AspNetMvcRC-setup.msi /l*v .\mvc_install.log
  5. наблюдение за работой ASP.NET MVC 1.0 Installer'a через Procmon.exe
  6. установка обновлений и hotfix'ов
  7. проверка на вирусы и трояны
  8. остановка лишних windows service'ов
  9. ... обсценная лексика
никак не помогут.

P.S.
После установки в папке С:\Users\имя_пользователя\AppData\Local\Temp появилось 5619 файлов в 1251 папках с префиксом "TempЦифра_" - их можно удалить.

ASP.NET MVC. Создание необходимой БД.

пятница, 6 марта 2009 г.,

Для работы ASP.NET MVC требуется БД с определенным набором таблиц, хранимых процедур и функций.
Чтобы создать БД необходимо (после создания ASP.NET MVC Web Application):
  1. Откомпилировать проект
  2. В Solution Explorer стать на папку MVC Application
  3. В главном меню выбрать Project - ASP.NET Configuration (откроется IE, а в папке App_Data появятся файлы БД: ASPNETDB.MDF и aspnetdb_log.ldf)
Другой способ создания/изменения БД:
  1. запустить aspnet_regsql.exe
    (находится в папке C:\Windows\Microsoft.NET\Framework\v2.0.50727)
  2. Нажать два раз Next.
  3. В поле Server указать ".\SQLEXPRESS".
  4. В поле Database указать, например, MyDb.
  5. Нажать Next (в результате в папке С:\Program Files\Microsoft SQL Server\MSSQL.1\MSSQL\Data будут созданы файлы БД: MyDb.mdf и MyDb_log.LDF)
Подключиться к БД можно из Visual Studio:
  1. Нажать Ctrl+Alt+S.
  2. А диалоге Add Connection нажать Browse...
  3. Указать путь C:\Program Files\Microsoft SQL Server\MSSQL.1\MSSQL\Data
  4. Выбрать файл MyDb.mdf
  5. Нажать OK
Также к БД можно полключиться из Microsoft SQL Server Management Studio:
  1. В диалоге Connect to Server указать Server name: .\SQLEXPRESS
  2. Нажать Ctrl+N
  3. Указать текст запроса: EXEC sp_attach_db @dbname = N'MyDb', @filename1 = N'C:\Program Files\Microsoft SQL Server\MSSQL.1\MSSQL\Data\MyDb.mdf'
  4. Нажать F5 (БД MyDB появится в списке Object Explorer если свернуть и развернуть Databases или в главном меню выбрать View/Refresh)
Если MyDB.mdf был открыт в Visual Studio, то получим сообщение об ошибке: "Msg 5120, Level 16, State 101, Line 1 Не удалось открыть физический файл 'С:\Program Files\Microsoft SQL Server\MSSQL.1\MSSQL\Data\MyDb.mdf'. Ошибка операционной системы 32: '32(error not found)'.".
В таком случае в Visual Studio надо закрыть соединение с БД:
  1. В Server Explorer стать на соединение MyDB
  2. В контекстном меню выбрать Delete (соединение с БД будет закрыто)
БД (MyDb.mdf и MyDb_log.LDF) можно переместить в свой проект в папку App_Data. После этого в Web.config надо заменить "aspnetdb.mdf" на "MyDb.mdf" и откомпилировать проект.

Ограничение доступа к страницам в ASP.NET MVC


Предположим, нам необходимо ограничить доступ к определенной странице.
Например, при попытке открыть страницу по ссылке "F1" (см. предыдущий пример) запрашивать имя и пароль.
Для этого надо определить атрибут Authorize у метода TestController.Help:

1[Authorize]
2public ActionResult Help()
3{
4    ViewData["Text"] = "help";
5    return View();
6}

Теперь при первом обращении к http://localhost:5545/Test/Help будет происходить перенаправление на страницу http://localhost:5545/Account/Login?ReturnUrl=%2fTest%2fHelp
После ввода корректного имени и пароля будет выполнено перенаправление на страницу http://localhost:5545/Test/Help.

Как это работает? ASP.NET MVC считывает у метода атрибут(ы) Authorize примерно следующим образом:


1foreach (var a in this.GetMethodAttributes<AuthorizeAttribute>("About"))
2    System.Diagnostics.Trace.WriteLine(a);

...


1public static class AtttributeHelper
2{
3    public static IEnumerable<T> GetMethodAttributes<T>(this object obj, string name)
4    {
5        if (string.IsNullOrEmpty(name))
6            return null;
7        Type type = obj is Type ? (Type)obj : obj.GetType();
8        var ma = type.GetMember(name);
9        return (ma.Length == 0)
10            ? null
11            : ma.First().GetCustomAttributes(typeof(T), true).Cast();
12    }
13}


P.S.
Для регистрации на сайте должна быть создана БД (см. здесь)

ASP.NET MVC. Примеры.


Примеры использования ASP.NET MVC:
  1. Sample Applications
  2. Kigg (скачал).
Второй раз смотрю на код ASP.NET MVC. Вроде неплохо.
Чтобы создать свой контроллер:
  1. Открыть Visual Studio
  2. Нажать Ctrl+Shift+N
  3. Выбрать Project Types: Web
  4. Выбрать Templates: ASP.NET MVC Web Application
    (в Visual Studio Team System появится диалог создания unit test project; нажать "ok")
  5. В Solution Explorer стать на папку Controllers
  6. Нажать Ctrl+Shift+A
  7. Выбрать Visual Studio installed tempates: MVC Controller Class
  8. Указать Name: TestController.cs (ВНИМАНИЕ: суффикс Controller - обязателен)
  9. Открыть TestController.cs и вместо "throw new NotImplementedException();"
    указать "return null;"
  10. Открыть Views\Shared\Site.Master и после тега body
    добавить <%= Html.ActionLink("Test", "Index", "Test") %>
  11. Нажать F5 (появится диалог Debugging Not Enabled; нажать "ок"; откроется IE)
  12. В левом верхнем углу щелкнуть по ссылке Test. Будет вызван метод Test.Index() и откроется http://localhost:5421/Test - пустая страница.
Чтобы на страницу вывести значение из метода TestController.Index:
  1. В Solution Explorer стать на папку Views и в контекстном меню выбать Add - New Folder; указать Test
  2. Стать на папку Test и нажать Ctrl+Shift+A
  3. Выбрать Visual Studio installed tempates: MVC View Content Page
  4. Указать Name: Index.aspx
  5. В диалоге Select a Master Page выбрать Project Folders: Views - Shared, Contents of folder: Site.Master
  6. Открыть Index.aspx и в тег asp:Content добавить
    <%= Html.Encode(ViewData["Result"]) %>
  7. Открыть Controllers\TestController.cs и в метод Index перед "return null;" добавить строку ViewData["Result"] = "res" + DateTime.Now; заменить "return null;" на "return View();"
  8. Нажать F5 (откроется IE)
  9. Щелкнуть по ссылке Test. Будет вызван метод Test.Index() и откроется страница http://localhost:5421/Test с текстом "res06.03.2009 17:00:18"
Чтобы в TestController добавить новый метод:
  1. Стать на папку Test и нажать Ctrl+Shift+A
  2. Выбрать Visual Studio installed tempates: MVC View Content Page
  3. Указать Name: Help.aspx
  4. В диалоге Select a Master Page выбрать Project Folders: Views - Shared, Contents of folder: Site.Master
  5. Открыть Help.aspx и в тег asp:Content добавить
    <%= Html.Encode(ViewData["Text"]) %>
  6. Открыть Controllers\TestController.cs и в класс TestController добавить метод:
    public ActionResult Help()
    {
    ViewData["Text"] = "help";
    return View();
    }
  7. В файл Views\Shared\Site.Master после тега body добавить
    <%= Html.ActionLink("F1", "Help", "Test") %>
  8. Нажать F5 (откроется IE)
  9. Щелкнуть по ссылке "F1". Будет вызван метод Test.Help() и откроется страница http://localhost:5421/Test/Help с текстом "help".
Пока все просто.