Ответы пользователя по тегу ASP.NET
  • Авторизация для 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 строк. С точки зрения пользователя это дико не удобно, и если выводится много-много строк, то они обычно разбиваются на страницы.
    Ответ написан
    Комментировать
  • Как связать два @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. Это позволяет еще больше отделить данные от представления, добавив, как это говорится по-научному, дополнительный уровень абстракции. Так что тут я Вас тоже полностью поддерживаю.

    Успехов!
    Ответ написан
    Комментировать
  • Как передать данные для строго типизированного частичного представления или для _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 комментарий
  • Как получить один из передаваемых параметров?

    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 комментариев
  • Лучшая книга по ASP.NET с нуля

    Valeriy1991
    @Valeriy1991
    Разработчик .NET C# (ASP.NET MVC) в Alfa-B, Moscow
    Добрый день!
    По MVC - полностью согласен с Neir0 - "ASP .NET MVC Framework с примерами на C#" Стивена Сандерсона.
    По WebForms - несмотря на то, что книга, предложенная dmomen - "Разработка Web-приложений в среде ASP.NET 2.0. Задача-проект-решение" более прикладная (на протяжении всей книги идет 1 сквозной проект, на котором изучается ASP.NET WebForms), я бы посоветовал начать с "Microsoft ASP.NET 4 с примерами на C# 2010 для профессионалов" (либо более новую) - все-таки там основы ASP.NET + ASP.NET WebForms, без которых разрабатывать на ASP.NET конечно можно, но знаний будет не хватать.
    + еще сайт www.asp.net со множеством различных пошаговых и понятных туториалов (сам по нему изучал ASP.NET WebForms + EF)
    Если располагаете временем, то посоветовал бы (на основе личного опыта) такую последовательность Ваших действий:
    1) "Microsoft ASP.NET 4 с примерами на C# 2010 для профессионалов" (или новее)
    2) "ASP .NET MVC3 Framework с примерами на C#" (или новее)
    3) ну а сайт asp.net - уже по ситуации. Мне, повторюсь, он помог при разработке фрилансного проекта на ASP.NET WebForms + EntityFramework. Плюс на этом сайте хорошо расписаны туториалы по ASP.NET WebAPI.
    По поводу MSDN - это чисто субъективно. Мне, например, сложно воспринимать ту информацию, которая там есть, а вот моему коллеге гораздо проще. Это уже на Ваш выбор. Но туда приходится заглядывать, чтобы узнать какие-то тонкости.

    Успехов!
    Ответ написан
    Комментировать
  • Посоветуйте курсы по ASP.NET в Москве

    Valeriy1991
    @Valeriy1991
    Разработчик .NET C# (ASP.NET MVC) в Alfa-B, Moscow
    Добрый день! Отвечу несмотря на то, что вопрос задан в далеком 2012. В свое время посещал курс "Программирование на C#" в учебном центре "Специалист" при МГТУ им. Баумана - specialist.ru. Мне понравилось, поэтому могу посоветовать этот учебный центр. Список всех курсов по Visual Studio - www.specialist.ru/product/visual-studio-courses.
    Ответ написан
    Комментировать