• Реализация frontend'а для ASP.NET MVC?

    Valeriy1991
    @Valeriy1991
    Разработчик .NET C# (ASP.NET MVC) в Alfa-B, Moscow
    Добрый день!

    Учитывая объем задач и наверняка не очень большие сроки их реализации, возможно, имеет смысл отдать front-end профессионалу. Но если таковой возможности нет, то я отдал бы предпочтение обычному Razor.

    Постараюсь объяснить - почему.

    1. AngularJS (и ему подобные) мне, увы, не знаком. Следовательно, нужно потратить достаточно много времени на его изучение и решение проблем в ходе использования в проекте. А это в свою очередь может сильно сказаться на сроках проекта.
    2. Использовать какие-либо готовые контролы (аля гриды jQueryUI и т.п.) - тут я бы не стал торопиться. Как ни крути, настает такой момент, когда нужно, чтобы эти контролы могли делать то, что от них хотят, но то, для чего они не приспособлены. Как следствие - код обрастает дикими костылями. К тому же, на мой взгляд, внешний вид оставляет желать лучшего... Если наступает понимание, что этот контрол сможет решить задачу - то тогда его можно применить.
    3. Взял бы в качестве основы front-end'а какой-нибудь нормальный frontend-framework (Bootstrap, FlatUI, Pure). Возможно - даже несколько (сам отдаю предпочтение Pure Grid + FlatUI). Проблем со стилизацией будет гораздо меньше, чем если всё самому с нуля писать.
    4. Razor вполне прост, если его правильно применять (имею в виду правильное разделение на Layout, Partial View, View, при необходимости кеширование вывода) - непонимаю, чем он Вас так пугает.
    5. Насчет всяких всплывающих окон, деревьев, гридов - отдал бы предпочтение специальным плагинам (отдельный плагин под окна, отдельный - под деревья, отдельный - под гриды). Как правило, можно найти очень удобные, простые и кастомизируемые решения. На мой взгляд, лучше использовать какие-то специализированные инструменты (которые решают только 1 задачу), чем унифицированные (которые могут решать целую кучу задач).

    Было бы здорово, если бы другие специалисты привели свою точку зрения. Интересно узнать, как люди решают подобные задачи...
    Ответ написан
    6 комментариев
  • Entity Framework как организовать ссылку таблицы на саму себя (model first)?

    Valeriy1991
    @Valeriy1991
    Разработчик .NET C# (ASP.NET MVC) в Alfa-B, Moscow
    День добрый! Под фразой "не дает добавить" можно понять множество вещей. Поконкретнее, пожалуйста, о том, что происходит при добавлении? Вылетает exception? Какой? Приведите в описании вопроса код, который осуществляет добавление.

    UPD from 26.05.2015:

    falc добрый день! Вы уверены в том, что в качестве хранилища нужно использовать БД? Если да, то, мне кажется, лучше сделать не 1 таблицу и в ней всё в одну кучу собирать, а 2 таблицы:

    1. таблица со словами и полями: id, word
    2. таблица синонимов с полями: id, id_main_word, id_synonym_word


    В первой таблице у Вас просто будет список слов, а во второй - список непосредственно синонимов (id - это ID записи, id_main_word - ID "главного слова", id_synonym_word - ID слова-синонима). Тогда у Вас получится в EF создать нормальные ассоциации.
    Ответ написан
    1 комментарий
  • Как правильно созвать контекст EF в конроллере asp.net?

    Valeriy1991
    @Valeriy1991
    Разработчик .NET C# (ASP.NET MVC) в Alfa-B, Moscow
    Всем добрый день!

    Правильно - создавать трехслойную архитектуру

    Открывать контекст EF в методе действия контроллера - плохая практика. Плохая потому что:
    1. это не соответствует трехуровневой архитектуре, а следовательно, значительно усложняет внесение изменений, масштабирование и сопровождение приложения;
    2. это сразу показывает низкий уровень понимания шаблона MVC - могут даже на работу не взять;
    3. EF - это модель. А контроллер по сути своей должен лишь получить данные (модель) и передать их в представление. То, каким образом формируются данные (EF, NHibernate, XML, Files, ...) - контроллер не должно волновать. Он лишь организовывает данные, чтобы передать их в представление. Часто модель разделяют на непосредственно модель и модель представления (аналог шаблона MVVM). Контроллер получает данные (модель), из них формирует модель представления и её передает в само представление. Зачем это надо - уже другой вопрос.

    Далее - позволю себе не согласиться с инициализацией контекста EF на весь контроллер - можно, конечно, но это, опять-таки, плохая практика, потому что:
    1. возникнут проблемы с использованием многопоточности и параллельных вычислений при работе с контекстом (библиотека TPL);
    2. возникнет проблема "устаревания" данных - т.к. контекст создан на контроллер, то придется постоянно его обновлять;
    3. это, опять же, показывает уровень и опыт разработчика, а следовательно, снижаются шансы при трудоустройстве (туда, где я сейчас работаю - точно не взяли бы программистов, которые практикуют формирование модели в контроллере или которые инициализируют контекст в контроллере или при запросе).

    Итог: контекст EF должен существовать как можно меньшее время - ровно столько, чтобы получить данные, обработать их, сформировать из них, например, другие объекты (обертки, модели, модели представлений).

    Читайте книгу "ASP.NET MVC 3/4/... Framework с примерами на C# для профессионалов" Адама Фримена и Стивена Сандерсона - там, можно сказать, приведены best practices по разработке в ASP.NET MVC с использованием EF.

    А вообще - всё зависит от задачи/проекта. Если это какой-нибудь учебный проект или ооооочень простое приложение - то можно для упрощения контекст инициализировать и в методе действия (контекст на метод действия), и при запросе (контекст на контроллер). Однако если Вы хотите повышать свой профессиональный уровень и заниматься enterprise-приложениями, то опытным путем Вы выясните, что самый лучший способ - это инициализация контекста на конкретную задачу.

    Удачи!

    P.S. Ничего плохого не имею против хабра (сам частенько читаю), но хабр - это не учебник, а источник разрозненной, но полезной информации. А Вам сейчас, судя по всему, нужна теория Структурированная теория. Найдите время и изучите "мат.часть". Поверьте, большинство вопросов по разработке на ASP.NET MVC у Вас просто отпадет.
    Ответ написан
    Комментировать
  • Как сформировать из доменной модели модель представления в ASP.NET MVC?

    Valeriy1991
    @Valeriy1991
    Разработчик .NET C# (ASP.NET MVC) в Alfa-B, Moscow
    Михаил снова здравствуйте! В-общем, меньше слов - больше кода. Toster_q187249.zip - здесь архив с приложением. Предметную область смоделировал так, как понял :)

    Честно говоря, ни разу не слышал фразы "доменная модель". Откуда этот термин? Обычно для описания данных используются термины "данные", "модель".

    Далее: прочтите от корки до корки книжку "ASP.NET MVC 3/4 Framework с примерами на C# для профессионалов", авторы: Адам Фримен, Стивен Сандерсон. Для MVC - на мой взгляд, это книга №1 для изучения ASP.NET MVC. Там есть всё, что нужно, и даже больше. У Вас, правда, могут возникнуть трудности с Entity Framework, потому что там они не так подробно объясняют, как с ним работать, (авторы, наверное, рассчитывают на небольшой опыт работы читателей с этим фреймворком). После чтения у Вас в голове всё встанет на свои места.

    Будут какие-то вопросы по проекту - пишите. Он, конечно, примитивный, но в целях обучения, на мой взгляд, подойдет.

    Вы, наверное, уже знаете, но, тем не менее, напишу: в контроллере должно быть минимум бизнес логики. Контроллер должен лишь получать откуда-то данные, формировать из них модель представления и отдавать модель представления в само представление. Всю логику работы с данными следует выносить в отдельный слой (например, в отдельную dll). Всю бизнес-логику, по хорошему, тоже следует выносить в отдельный слой. В итоге контроллеры MVC-приложения должны "ломиться" в слой бизнес-логики, который в свою очередь, ломится в слой работы с данными, вытаскивает их, обрабатывает и отдает "наверх" в клиентское приложение (MVC-application). Это позволяет формировать трехуровневую ахитектуру решений и тем самым создавать более масштабируемые и гибкие приложения.

    Например, то приложение, которое я Вам прислал, состоит их 2 слоев:
    1) MVC-app;
    2) Core.DAL - слой работы с данными.
    В идеале следовало бы добавить новый слой (например, Core.BL или Core.BAL) - слой бизнес-логики.
    Вот на всякий случай: Как организовать архитектуру приложений «Система управления проектами»?

    Успехов в нашем нелегком деле!
    Ответ написан
  • Авторизация для SignalR?

    Valeriy1991
    @Valeriy1991
    Разработчик .NET C# (ASP.NET MVC) в Alfa-B, Moscow
    Добрый день!

    Я, к сожалению, такую задачу не решал, но могу предположить, что логику авторизации в методе действия, который занимается авторизацией, можно просто продублировать в метод C# внутри хаба SignalR. Этот метод будет принимать, например, string username и string password, и дальше с ними работать.

    Плюс (Вы наверняка знаете) на www.asp.net есть статьи, посвященные модели безопасности SignalR и авторизации с помощью SignalR:

    www.asp.net/signalr/overview/security/introduction...
    www.asp.net/signalr/overview/security/hub-authorization
    www.asp.net/signalr/overview/security/persistent-c...

    Вроде бы там достаточно просто... Хотя я могу ошибаться.
    Ответ написан
  • Зачем нужен SignalR?

    Valeriy1991
    @Valeriy1991
    Разработчик .NET C# (ASP.NET MVC) в Alfa-B, Moscow
    Добрый день! Сомневаюсь, что ответ еще актуален, но тем не менее :)

    Если не ошибаюсь, запросы типа

    localhost:50806/f7286cf7d99c4a688161aefafd09c787/a...

    осуществляет вовсе не Ваш проект, а сама Visual Studio 2013 (в 2012 такого вроде бы не было). Более подробно:

    1. stackoverflow.com/questions/21508222/where-are-the...

    2. blogs.msdn.com/b/webdev/archive/2013/06/28/browser...

    По поводу того, что долго выполняется и прочее: есть предположение, что причиной этому является использование Local IIS Express, под управлением которого вертится веб-приложение, запускаемое из отладчика в Visual Studio. Попробуйте перенести на обычный IIS или на хостинг, в-общем, переместите веб-приложение в более производительную среду.

    К тому же в реальных приложениях у Вас вряд ли возникнет потребность в выводе 1500 строк. С точки зрения пользователя это дико не удобно, и если выводится много-много строк, то они обычно разбиваются на страницы.
    Ответ написан
    Комментировать
  • Как организовать архитектуру приложений "Система управления проектами"?

    Valeriy1991
    @Valeriy1991
    Разработчик .NET C# (ASP.NET MVC) в Alfa-B, Moscow
    Добрый день!

    Хотелось бы добавить про контексты EF: stackoverflow.com/questions/9415955/c-sharp-workin...

    Поясню: когда я впервые столкнулся с масштабным применением EF, в том проекте использовался класс, в котором в виде поля объявлялся контекст. Т.е. контекст EF существовал все время, пока существовал этот класс (DataService). Так вот: все было хорошо до тех пор, пока не пришлось заняться ускорением работы приложения. И обнаружилось, что такой подход практически не позволяет использовать библиотеку TPL (Task Parallel Library), т.к. постоянно возникали ошибки, связанные с тем, что "контекст уже открыт". Ни в коем случае не используйте контекст EF по паттерну "Одиночка" и в статическом классе - наберетесь больших проблем и замучаетесь исправлять ошибки. Исходя из своего опыта (а также опыта моих коллег и друзей), пока что самым удачным применением EF является (как и написано в статье) использование контекста с коротким жизненным циклом, т.е. написали метод (который, например, получает список городов из БД и который, соответственно, будет внутри слоя доступа к данным), внутри инициализируем контекст (лучше с помощью using), получаем данные, оборачиваем их в модель (если надо), закрываем контекст и возвращаем данные наверх.

    P.S. Хотелось бы также порекомендовать Вам НЕ работать с классами, генерируемыми EF, в слое бизнес-логики, а писать для этих классов обертки (модели). В одном из проектов, которыми я занимался, используется WPF + MVVM + IoC (Unity Container), и в нем же весь интерфейс биндится к классам EF... Поверьте, это ужасно. Лучше сразу проектируйте так, чтобы классы EF у Вас использовались только внутри слоя доступа к данным, а наверху (в бизнес логике) вся работа ведется с классами-обертками над классами EF (т.е. чтобы классы слоя бизнес-логики ничего не знали о классах EF). В этом еще и такой плюс, что если Вы по каким-либо причинам решите отказаться от EF и перейти, например, на NHibernate или Native Sql, то все изменения коснутся только слоя доступа к данным.
    Ответ написан
    Комментировать
  • Как связать два @html.dropdownlistfor?

    Valeriy1991
    @Valeriy1991
    Разработчик .NET C# (ASP.NET MVC) в Alfa-B, Moscow
    Добрый день!

    Во-первых, мне непонятен вопрос
    Подскажите пожалуйста как мне указать значение из таблицы вместо 1 (where h.TeamId == 1) в этом условии ???


    А во-вторых, судя из заголовка
    Как связать два @html.dropdownlistfor
    (если я его правильно понял), то на стороне сервера (т.е. на C#) Вы не свяжете несколько выпадающих списков. Если Вам нужно, чтобы при выборе какого-либо элемента из списка №1 (пусть это будет
    <select id="list_1"...>...</select>
    ) автоматически менялись элементы в списке №2 (пусть это будет
    <select id="list_2"...>...</select>
    ) , то Вам надо сделать следующее:
    1. используя jQuery, повесить на событие change элемента select[id="list_1"] обработчик
    2. этот обработчик будет определять, какое значение выбрал пользователь в списке №1 и отправлять ajax-запрос на какой-нибудь url
    3. на стороне сервера реализовать метод действия, который будет принимать параметр запроса (из ajax-запроса), соответствующий выбранному в списке №1 элементу, ломиться в БД, получать отфильтрованные данные и отправлять их, например, во View (в которой есть @html.dropdownlistfor)
    4. затем на ajax-запрос (из п.2) на событие success или метод done повесить обработчик, который будет парсить полученный html-код и полностью заменять содержимое списка №2 новым html-кодом.

    Но, повторюсь, этот ответ основан на догадке из заголовка данного поста, потому что сам вопрос поставлен неточно.

    Успехов!
    Ответ написан
  • Как лучше реализовать ежедневное обновление курсов валют в БД для ASP.NET MVC?

    Valeriy1991
    @Valeriy1991 Автор вопроса
    Разработчик .NET C# (ASP.NET MVC) в Alfa-B, Moscow
    В итоге с другом нашли альтернативное решение.
    Написали консольное приложение, которое берет последние курсы валют с сервиса ЦБ РФ и вызывает хранимую процедуру из БД, которая принимает табличный тип и обновляет курсы валют в БД. В текущей используемой панели управления хостингом имеется инструмент "планировщик задач" (в-общем, планировщик Windows). В настройках указали путь к консольному приложению, выставили периодический запуск этого приложения 1 раз в сутки - и вуаля! Задача решена.

    И тем не менее, спасибо всем за ответы.
    Ответ написан
    Комментировать
  • Почему теряется значение ViewBag?

    Valeriy1991
    @Valeriy1991
    Разработчик .NET C# (ASP.NET MVC) в Alfa-B, Moscow
    Добрый день!

    @manisha вынужден сделать 2 замечания:

    1. В методе CreateFeedBack есть входной параметр по имени note - это значит, что метод должен принимать какое-то значение для этого параметра. Если он не будет принимать никакого значения, то переменная получит значение по-умолчанию. Т.к. у Вас переменная note является string, то по-умолчанию в нее запишется null.
    URL Вы формируете следующим образом:
    ajaxURL: '@Url.Action("CreateFeedBack", "Email")',
    В итоге у Вас в переменную ajaxURL запишется значение '/Email/CreateFeedBack', но без параметра запроса "note", поэтому на сервер в метод действия CreateFeedBack в переменную note запишется null.
    Чтобы правильно передать переменную в метод запроса, у метода Url.Action есть перегруженный метод, принимающий объект с параметрами запроса:
    Url.Action("CreateFeedBack", "Email", new { note = "my some note" })

    Если Вы будете использовать его, то тогда код:
    ajaxURL: '@Url.Action("CreateFeedBack", "Email", new { note = "my some note" })',

    в переменную ajaxURL уже запишет значение '/Email/CreateFeedBack?note=my+some+note' (или как-то так), и при отправке запроса на этот URL в метод действия CreateFeedBack в переменную note запишется Ваша строка: "my some note".

    2. Как правильно сказал @MIsternik,
    ViewBag используется при формировании страницы на сервер
    , т.е. сие означает следующее:
    ViewBag формируется в случае, когда у Вас запрос приходит в метод действия, этот метод действия что-то выполняет и возвращает конкретное представление, например так:
    public ActionResult Index()
    {
          // здесь что-то явно происходит...
          ViewBag.SomeVar = "some value";
          return View(); // <--- явно возвращает конкретное представление
    }

    При этом в самом представлении:
    @{
        Layout = null;
    }
    <h2>Index</h2>
    
    @ViewBag.SomeVar

    во ViewBag будет свойство SomeVar со значением "some value".

    У Вас же метод действия ничего не возвращает, поэтому представления он не сформирует.

    Вам нужно сделать так:
    public ActionResult CreateFeedBack(string note)
    {
          ViewBag.Note = note;
          return View();
    }


    В таком случае значение из входящего параметра запроса запишется в переменную note, которая запишется в свойство Note динамического объекта ViewBag, сформирует представление, в котором будет использоваться ViewBag.Note, и вернет ответ клиенту. В ответе придет обычный html-код.

    Важно!
    Учтите, что т.к. Вы используете ajax-запрос к методу действия, то этот метод действия должен возвращать частичное представление - т.е. такое представление, у которого Layout = null;, иначе в ответ на ajax-запрос Вам придет полный html-код вместе c DOCTYPE, тегами html, head, body и другими. Если Вы явно укажете Layout = null;, то в ответе получите только код из представления и ничего больше (никаких слоев/мастер-страниц).

    Как говорится, найдите время и учите матчасть - прочтите книги по ASP.NET MVC, потому что поставленный вопрос относится к разряду вопросов основ ASP.NET MVC, его фундамента. Поверьте, при прочтении хотя бы 1 книги от корки до корки у Вас снимется масса вопросов, а в голове сформируется полная картина того, как правильно работать с ASP.NET MVC.

    Надеюсь, я Вам немного помог.
    Успехов!
    Ответ написан
    Комментировать
  • TempData to string возможно ли?

    Valeriy1991
    @Valeriy1991
    Разработчик .NET C# (ASP.NET MVC) в Alfa-B, Moscow
    Добрый день!

    Если я Вас правильно понял, то можно:
    [HttpGet]
    public ActionResult Index()
    {
          TempData["temp"] = "any string";
          return View();
    }
    
    [HttpPost]
    public ActionResult Index()
    {
          string temp = (string)TempData["temp"];
          // либо так: string temp = TempData["temp"].ToString();
          return View();
    }


    Успехов!
    Ответ написан
    Комментировать
  • View model как правильно организовать?

    Valeriy1991
    @Valeriy1991
    Разработчик .NET C# (ASP.NET MVC) в Alfa-B, Moscow
    Всем добрый день! Хм, а чем не угодило наследование? Сделайте базовую модель представления - BaseViewModel, засуньте туда все основные свойства. Если Вам одни свойства нужны для Add, а другие для Edit, так просто одни поместите в AddViewModel, а другие - в EditViewModel. При этом общие свойства типа Id, Name и др. Вам также будут доступны в обеих ViewModel, т.к. и AddViewModel, и EditViewModel будут унаследованы от BaseViewModel.

    В защиту такого решения могу сказать следующее:
    1. Все общие свойства вынесены отдельно. Они доступны в любой момент. В случае изменения общих свойств их можно редактировать в одном месте.
    2. Специальные свойства, нужные только для конкретной ситуации (Add, Edit, Delete, ...), можно вынести в специальную модель представления.

    Зачем Вам усложнять себе жизнь дублированием кусков кода? Я думаю, не нужно объяснять, чем это грозит в случае изменений либо масштабируемости приложения...

    По поводу выбора между моделью и представлением: лично я после разработки на WPF с использованием шаблона MVVM использую ViewModel и в MVC. Это позволяет еще больше отделить данные от представления, добавив, как это говорится по-научному, дополнительный уровень абстракции. Так что тут я Вас тоже полностью поддерживаю.

    Успехов!
    Ответ написан
    Комментировать
  • Есть ли сайты на русском языке по типо этого сайта codecademy.com?

    Valeriy1991
    @Valeriy1991
    Разработчик .NET C# (ASP.NET MVC) в Alfa-B, Moscow
    Добрый день!

    ИНТУИТ - там много различных текстовых и видео лекций по IT. Ну а когда подтянете английский, думаю, можно и Teamtreehouse воспользоваться.

    Успехов!
    Ответ написан
    Комментировать
  • Как передать данные для строго типизированного частичного представления или для _Layout.cshtml?

    Valeriy1991
    @Valeriy1991
    Разработчик .NET C# (ASP.NET MVC) в Alfa-B, Moscow
    Добрый день!
    Используя
    @{Html.RenderPartial("_Navigation");}
    Вы просто отображаете представление.

    Чтобы передать модель в представление, нужно эту модель сформировать. Модель лучше сформировать в методе действия, например, так:
    [HttpGet]
    public ActionResult Navigation()
    {
    	List<MyClass> classes = new List<MyClass>();
    	classes.Add(new MyClass() { Id = 1, Name = "item 1" });
    	classes.Add(new MyClass() { Id = 2, Name = "item 2" });
    	classes.Add(new MyClass() { Id = 3, Name = "item 3" });
    	
    	return View("_Navigation", classes);
    }


    Теперь Вам нужно заменить
    @{Html.RenderPartial("_Navigation");}
    на это:
    @{Html.RenderAction("Navigation", "YourController");}


    RenderPartial просто рендерит представление, а RenderAction грубо говоря, "запрашивает представление у метода действия".

    Второй Ваш вопрос
    Или можно ли как то передать для _Layout.cshtml? тогда получится глобально
    не понял.

    Надеюсь, помог Вам чем-нибудь.
    Успехов!
    Ответ написан
    1 комментарий
  • Какую выбрать технологию и язык для написания диплома (ASP.NET MVC 4 или Yii PHP Framework или Ruby on Rails)?

    Valeriy1991
    @Valeriy1991
    Разработчик .NET C# (ASP.NET MVC) в Alfa-B, Moscow
    Добрый день!
    Вставлю свои 5 копеек по ASP.NET MVC:

    1. Скорость изучения.
    Учитывая, что Вы уже знакомы с C#, то изучение основ ASP.NET и особенностей разработки на ASP.NET MVC с помощью книг "Microsoft ASP .NET 4 с примерами на c# 2010 для профессионалов" (Мэтью МакДональд, Адам Фримен, Марио Шпушта) и "ASP.NET MVC3 (или 4) Framework с примерами на C# для профессионалов" (Адам Фримен, Стивен Сандерсон) займет у Вас примерно месяц при условии 4-5 часов занятий в день.
    Если будете разрабатывать на ASP.NET MVC и выберете ORM EntityFramework, то берите сразу последнюю (6.1.) версию. Статья по EF6 Вам в помощь.

    2. Функциональность.
    Этого пункта не понял, поэтому лучше промолчу.

    3. Создание api (или через что лучше организовать доступ с сайту через мобильное приложение?) для приложения андроид.
    На asp.net есть отличные статьи по ASP.NET WebAPI.

    4. Возможность найти помощь по проблемам (другими словами размер лояльного сообщества)
    К Вашим услугам:
    MSDN
    asp.net
    Stackoverflow
    Собственно, сам Toster и Хабр
    Лично я обычно делаю так: захожу в гугл и формирую запрос по английски, потому что по личному опыту, так решить проблему можно быстрее, чем искать на русскоязычных источниках.

    5. Сложность изучения
    Опять-таки учитывая тот факт, что с C# Вы уже знакомы, то - примерно средняя (чисто субъективно).

    6. Производительность
    Боюсь, тут я ничем Вам не смогу помочь, т.к. на PHP/RoR я не программировал и производительность всех трех технологий не сравнивал. Что касательно MVC, то заметил, что на локальном ПК (localhost) при разработке веб-приложение грузится чуть медленнее, чем на реальном хостинге или выделенном сервере (Да оно, собственно говоря, и понятно, т.к. на хостинге-то стоит нормальный IIS, а в VisualStudio при build проекта он запускается под Local IIS Express)

    7. Подскажите что еще важно при выборе?
    Пожалуй, цена вопроса. Так, для разработки на PHP Вам достаточно (если я не ошибаюсь) любого бесплатного редактора (Eclipse, Aptana, Codelobster, ...) и бесплатного веб-сервера Apache. Что касается разработки под ASP.NET MVC (да и вообще на стеке технологий .NET), то тут у Вас есть 2 пути:
    1) использование free Express-версий продуктов (Visual Studio, MS SQL Server)
    2) соответственно, использование платных версий тех же продуктов.

    И еще пару моментов:
    1. Узнайте, состоит ли Ваш универ в альянсе Microsoft Academy Alliance (или как-то так). Мой универ состоял, и нам в Dreamspark были доступны все платные продукты за бесплатно - VS вплоть до Ultimate, MS SQL Server, все версии Windows и др. (естесственно, "в образовательных целях"). Если состоит, то узнайте у Ваших IT-преподователей, как получить доступ. Когда учился в универе, меня регистрирова препод, а потом на мой email пришло письмо на english, что-то вроде "ура, вы зарегистрированы, ваши данные для входа такие-то...".
    2. Если п.1 не сработал, то есть сайт - ИНТУИТ. Закончив там (вроде бы достаточно только 1 курса) курс от Microsoft, вы получаете ключ для регистрации на Dreamspark, в котором Вам открываются след.возможности:
    - Visual Studio all versions professional
    - MS SQL Server all versions
    - Windows + Windows Server
    И это, опять-таки, все бесплатно.

    По поводу Вашей темы диплома.
    Лично я немного не согласен с @SamDark в том плане, что "важна тема диплома, ее новизна и практическое значение". Новизна и практическое значение важны больше при разработке и защите различных диссертаций (докторских и какие там еще есть?), чем для диплома. Ваша идея, считаю, отличная, и неважно, что кто-то говорит, что "таких много". Да, много, но можно предложить свое решение задач, которое будет интереснее, красивее, удобнее, дешевле, проще, ... (нужное подчеркнуть). Если Вам эта тема интересна, и, что называется, тревожит душу, то беритесь за нее. Важна не идея, а ее реализация. К примеру: zappos.com - интернет-магазин обуви. Вроде бы чертова обувь... А если присмотреться, то их бизнес уникален (точнее, уникально предложенное ими решение проблемы - покупка обуви в интернете). Или basecamp от 37signals - вроде бы система управления проектами. А ведь Microsoft Project - тоже система управления проектами. Но на мой субъективный взгляд они и рядом не стоят. Разница в идее? Нет. Разница в реализации. А если получится действительно хороший продукт, то можно его превратить в SaaS и получать за это свои кровные.

    Надеюсь, я Вам немного помог в Вашем выборе.
    Ответ написан
    2 комментария
  • Как получить один из передаваемых параметров?

    Valeriy1991
    @Valeriy1991
    Разработчик .NET C# (ASP.NET MVC) в Alfa-B, Moscow
    Добрый день!

    Возможно, вопрос еще актуален, поэтому отвечу.
    Для передачи параметра в метод действия Вам необходимо, чтобы сам метод действия принимал этот параметр (как правильно указал chydaya):
    public ActionResult Dialog(string dataDialogId)
    {
    	//...
    	return View();
    }


    Прописывать значения параметров в маршруте вовсе необязательно. Т.е. маршрут может быть стандартным:
    routes.MapRoute(
    	name: "Default",
    	url: "{controller}/{action}",
    	defaults: new { controller = "Home", action = "Index" }
    );


    Если Вы для разработки используете Visual Studio, то при вводе "Html.ActionLink(" у Вас сразу срабатывает IntelliSense, которая подсказывает, какие входные параметры есть у этого метода. И если внимательно присмотреться, то, как верно заметил Vadimyan, у него есть различные перегрузки, и в некоторых есть параметр object routeValues - это то, что Вам нужно. Именно в этом параметре Вы указываете переменные для метода действия, например, так:
    @Html.ActionLink("Вход", "Dialog", new { dataDialogId = "entry" })


    В Вашем примере, который Вы указали в вопросе:
    @Html.ActionLink("Вход", "Dialog", null,
    
                                   new
                                   {
                                       @class = "openDialog",
                                       data_dialog_id = "entry",
                                       data_dialog_title = "Вход",
                                       data_dialog_width = "auto",
                                       data_dialog_height = "auto"
                                   })

    Вы задаете html-атрибуты, а в качестве переменных маршрута у Вас стоит null. Сгенерированная html-разметка у Вас будет иметь следующий вид:
    <a href="/{какой-то контроллер}/Dialog" class="openDialog" data_dialog_id = "entry" data_dialog_title = "Вход" data_dialog_width = "auto" data_dialog_height = "auto">Вход</a>


    Общая рекомендация
    Потратьте время, чтобы от и до изучить MVC по книге "ASP.NET MVC3 Framework с примерами на C# для профессионалов". Это фундамент, и даже на asp.net Вы не найдете настолько подробной информации о том, как работает и как правильно работать с ASP.NET MVC. Я пользовался туториалами (еще по WebForms + EntityFramework) с сайта asp.net, но они направлены на то, чтобы "прочитал туториал и начал делать". Однако если Вы хотите грамотно разрабатывать на ASP.NET MVC, начните с изучения основ и фундамента.

    Надеюсь, я Вам немного помог.
    Успехов!
    Ответ написан
    Комментировать
  • Как вы реализовываете авторизацию в ASP.net MVC?

    Valeriy1991
    @Valeriy1991
    Разработчик .NET C# (ASP.NET MVC) в Alfa-B, Moscow
    Добрый день!

    Использую стандартный Membership API. Честно говоря, пока что не замечал за ним никаких ошибок в работе/глюков или странного поведения. Я не анализировал sql-код, описанный в хранимых процедурах Membership API, и потому не могу рассуждать о его "монструозности", но лично для меня у него есть следующие плюсы:
    1) можно быстро развернуть с помощью утилиты aspnet_regsql
    2) можно с помощью той же утилиты настроить его установку таким образом, чтобы установить только то, что Вам нужно (либо всё, либо только профили, либо роли и т.д.)
    3) имеется много информации по работе с ним (чего не скажешь про Identity, во всяком случае, книжек с Identity, в которых подробно бы описывались принципы работы с ним, я не обнаружил)
    4) с ним довольно просто и легко работать в коде (подробно можно прочитать в книжках "Microsoft ASP .NET 4 с примерами на c# 2010 для профессионалов" и "ASP.NET MVC 3/4 Framework с примерами на C# для профессионалов", особенно в первой книге, где в основном рассказывается про ASP.NET WebForms, очень подробно описана авторизация, аутентификация, членство, роли, профили - да все, что есть в ASP.NET, поэтому эту книгу стоит почитать. Вторая книжка - уже чисто по архитектуре ASP.NET MVC, и там основ членства, авторизации, ролей и прочего уже нет.)

    Но есть и минусы:
    1) использует стандартную схему БД - "dbo". Чтобы подружить его с другими схемами, нужно писать свой, кастомный membership provider.
    2) в нескольких источниках слышал о том, что он, как и сказал Alexey_Gagarin, "моструозен", что код sql, используемый в хранимых процедурах, не оптимизирован. Повторюсь, я не проверял, но мне его функциональности пока что вполне достаточно.

    Успехов!
    Ответ написан
    3 комментария
  • Как реализовать роут в ASP.net MVC?

    Valeriy1991
    @Valeriy1991
    Разработчик .NET C# (ASP.NET MVC) в Alfa-B, Moscow
    Добрый день!

    Если я Вас правильно понял, то маршрут будет такой:
    routes.MapRoute(
    	name: "",
    	url: "site/{parametr}",
    	defaults: new { controller = "Home", action = "Index", parametr = "index" }
    );

    Если Вам необходимо, чтобы значение parametr было равно "index" при запросе главной страницы сайта (т.е. пользователь запрашивает, например, "yoursite.ru"), то самым первым маршрутом должен быть следующий маршрут:
    routes.MapRoute(
    	name: "",
    	url: "",
    	defaults: new { controller = "Home", action = "Index", parametr = "index" }
    );

    Заметьте, что url пустой. Это соответствует шаблону URL вида "/", поэтому такой маршрут будет работать для корневого URL всего сайта, т.е. для "yoursite.ru".

    Для такого маршрута Ваш метод действия должен выглядеть примерно так:
    public ActionResult Index(string parametr)
    {
    	if(parametr != null)
    	{
    		switch(parametr)
    		{
    			case "index":
    				return View();
    			default:
    				//return RedirectToAction("IndexOther", "Home");
    				//или
    				return View("IndexOther");
    		}
    	}	
    	// Здесь что-то происходит...
    	return View(); 
    }

    либо можно указать переменную parametr со значением по-умолчанию в самом методе действия:
    public ActionResult Index(string parametr = "index")
    {
    	switch(parametr)
    	{
    		case "index":
    			return View();
    		default:
    			//return RedirectToAction("IndexOther", "Home");
    			//или
    			return View("IndexOther");
    	}
    	// Здесь что-то происходит...
    	return View();
    }


    Честно скажу, я не проверял эти маршруты в, так сказать, рабочей среде. Если у Вас не получится, тогда сообщите об этом, сделаю тестовый проект, проверю.

    Надеюсь, смог Вам помочь.
    Успехов!
    Ответ написан
  • Как передать определенный параметр элемента в списке?

    Valeriy1991
    @Valeriy1991
    Разработчик .NET C# (ASP.NET MVC) в Alfa-B, Moscow
    Добрый день!

    1. Я, возможно, что-то немного не понял, но использовать тип string для поля Id - плохая практика. Используйте int вместо string.
    2. Называйте переменные правильно: если у Вас список ответов, то лучше вместо "Answer" назовите Answers" или "AnswerList" - старайтесь писать такой код, чтобы с ним после Вас мог легко работать другой программист.
    3. (на всякий случай) Для сообщений валидации можно использовать атрибуты (Required, MaxLength, ...) - я заметил, что в ValidationMessageFor Вы используете "" для текста сообщения валидации.
    4. В классе Answer у Вас есть свойство Chosen - если я правильно понимаю, это "Выбран", т.е. это логическая переменная, которая может быть либо "Да", либо "Нет". Зачем используете тип int, ведь есть тип bool?
    4. Не знаю, как у Вас, но не заполнив коллекцию Answer(s) в модели PollModel на сервере, Вы не сможете обращаться к ней через Single(), потому что в методе действия Create, который Вы привели, модель не заполняется, соответственно, коллекция Answer(s) равна null, в результате - ошибка, т.к. у null-объекта нельзя обращаться к свойствам. Поэтому Вам нужно как минимум сформировать модель на сервере, например, так:
    [HttpGet]
    public ActionResult Create()
    {
         List<Answer> answers = new List<Answer>();
         answers.Add(new Answer() { Id = 1, QuestionId = 1, Text = "Вопрос №1", Chosen = false });
         PollModel viewModel = new PollModel()
         {
              Id = "1", 
              UserIdCreated = "user1",
              Answers = answers
         };
         return View(viewModel);
    }

    5. Т.к. у Вас коллекция Answer(s), то для правильной привязки нужно правильно сформировать View, потому что привязка к коллекциям в ASP.NET MVC осуществляется особым образом - если посмотрите на html-код, то увидите, что тег input, в который нужно ввести текст, имеет атрибут name="Answers[0].Text и атрибут id="Answers_0__Text". Так работает связыватель модели (Model Binder) в ASP.NET MVC по-умолчанию .

    Рабочий пример - основан на шаблоне ASP.NET MVC 4 Internet Application в VS 2012:
    HomeController.cs:
    [HttpGet]
            public ActionResult Create()
            {
                List<Answer> answers = new List<Answer>();
                answers.Add(new Answer() { Id = 1, QuestionId = 1, Text = "Вопрос №1", Chosen = false });
                PollModel viewModel = new PollModel()
                {
                    Id = "1", 
                    UserIdCreated = "user1",
                    Answers = answers
                };
                return View(viewModel);
            }
    
            [HttpPost]
            public ActionResult Create(PollModel viewModel)
            {
                TempData["Message"] = String.Format("Текст Вашего вопроса - {0}", viewModel.Answers.First().Text);
                return View(viewModel);
            }

    Create.cshmtl:
    @using TosterQuestion101113_MVC.Models;
    @model PollModel
    
    @{
        ViewBag.Title = "Create";
        Layout = "~/Views/Shared/_Layout.cshtml";
    }
    
    <h2>Create</h2>
    <div class="form-group">
        @using (Html.BeginForm("Create", "Home", FormMethod.Post, null))
        {
            if (TempData["Message"] != null)
            {
                <div class="message">
                    @TempData["Message"]
                </div>
            }
            
            @Html.LabelFor(e => e.Answers, new { @class = "control-label col-md-2" })
            for (int i = 0; i < Model.Answers.Count(); i++)
            {
                <div class="col-md-10">
                @Html.EditorFor(e => e.Answers[i].Text, new { htmlAttributes = new { @class = "form-control" } })
                @Html.ValidationMessageFor(e => e.Answers.Single().Text, "", new { @class = "text-danger" })
            </div>
            }
            
            <div>
                <input type="submit" value="ОК!" />
            </div>
        }
    </div>


    Замечания:
    1. Свойство IEnumerable<Answer> Answer изменено на IList<Answer> Answers - потому, что Ilist предоставляет доступ к методу Count() для реализации перечисления в цикле
    2. Answer.Single().Text изменено на Answers[i].Text
    3. И вообще - у меня сложилось впечатление, что Вы начали недавно изучать ASP.NET MVC и в том числе не так давно программируете. Поэтому я вынужден настаивать: читайте от корки до корки книгу "ASP.NET MVC3 (либо 4) Framework с примерами на C# для профессионалов" - там всё просто отлично объяснен ASP.NET MVC.

    Надеюсь, я Вам немного помог.
    Успехов!
    Ответ написан
    Комментировать
  • 301 redirect ASP.NET?

    Valeriy1991
    @Valeriy1991
    Разработчик .NET C# (ASP.NET MVC) в Alfa-B, Moscow
    Содержимое web.config - реально работающий пример (названия сайтов изменены на фейковые), который:
    1) при переходе на www.company.ru перенаправляет на company.ru
    2) при переходе на mysite.com перенаправляет на company.ru
    3) при переходе на www.mysite.com перенаправляет на company.ru
    4) сохраняется ссылочная целостность, т.е. при переходе по www.mysite.com/home/write_to_us перенаправляет на company.ru/home/write_to_us

    Если не работает, значит, что-то с модулем URL Rewrite Module в IIS.

    На сайте mysite.com (с которого будет редирект) в web.config пишем:

    <?xml version="1.0" encoding="utf-8"?>
    <configuration>
      <system.webServer>
    	<rewrite>
    		<rules>			
    			<rule name="Condition1" stopProcessing="true">
    				<match url="^(.*)$" ignoreCase="false" />
    				<conditions logicalGrouping="MatchAll">
    					<add input="{HTTP_HOST}" pattern="^(www\.)?mysite\.com$" />
    				</conditions>
    				<action type="Redirect" url="http://company.ru/{R:1}" redirectType="Permanent" />
    			</rule>
    			<rule name="Condition2" stopProcessing="true">
    				<match url="^(.*)$" ignoreCase="false" />
    				<conditions logicalGrouping="MatchAll">
    						<add input="{HTTP_HOST}" pattern="^www\.company\.ru" />
    				</conditions>
    				<action type="Redirect" url="http://company.ru/{R:1}" redirectType="Permanent" />
    			</rule>
    		</rules>
    	</rewrite>
      </system.webServer>
    </configuration>


    На сайте company.ru (на который будет редирект) в web.config пишем:

    <?xml version="1.0" encoding="utf-8"?>
    <configuration>
      ...
      <system.webServer>
    	  <rewrite>
    		  <rules>
    			  <rule name="Redirect to company.ru 1" stopProcessing="true">
    				  <match url="^(.*)$" ignoreCase="false" />
    				  <conditions logicalGrouping="MatchAll">
    					  <add input="{HTTP_HOST}" pattern="^(www\.)?mysite\.com$" />
    				  </conditions>
    				  <action type="Redirect" url="http://company.ru/{R:1}" redirectType="Permanent" />
    			  </rule>
    			  <rule name="Redirect to company.ru 2" stopProcessing="true">
    				  <match url="^(.*)$" ignoreCase="false" />
    				  <conditions logicalGrouping="MatchAll">
    						  <add input="{HTTP_HOST}" pattern="^www\.company\.ru" />
    				  </conditions>
    				  <action type="Redirect" url="http://company.ru/{R:1}" redirectType="Permanent" />
    			  </rule>
    		  </rules>
    	  </rewrite>
      </system.webServer>
      ...
    </configuration>


    Возможно, сама Visual Studio будет у Вас ругаться на наличие секции "rewrite" - у меня она эту секцию подчеркивала. В чем причина - я, честно говоря, не помню, но на самом сайте уже все работает на ура.

    Успехов!
    Ответ написан
    8 комментариев