简介
"This book begins with you working along as Scott Guthrie builds a complete ASP.NET MVC reference application. He begins NerdDinner by using the File->New Project menu command within Visual Studio to create a new ASP.NET MVC Application. You'll then incrementally add functionality and features. Along the way you'll cover how to create a database, build a model layer with business rule validations, implement listing/details data browsing, provide CRUD (Create, Update, Delete) data form entry support, implement efficient data paging, reuse UI using master pages and partials, secure the application using authentication and authorization, use AJAX to deliver dynamic updates and interactive map support, and implement automated unit testing. From there, the bulk of the rest of the book begins with the basic concepts around the model view controller pattern, including the little history and the state of the MVC on the web today. We'll then go into the ways that MVC is different from ASP.NET Web Forms. We'll explore the structure of a standard MVC application and see what you get out of the box. Next we dig deep into routing and see the role URLs play in your application. We'll deep dive into controllers and views and see what role the Ajax plays in your applications. The last third of the book focuses entirely on advanced techniques and extending the framework." - product description.
目录
Table Of Contents:
Introduction xvii
NerdDinner 1(164)
File New Project 5(8)
Examining the NerdDinner Directory Structure 7(2)
Running the NerdDinner Application 9(3)
Testing the NerdDinner Application 12(1)
Creating the Database 13(7)
Creating a New SQL Server Express Database 14(1)
Creating Tables within Our Database 15(3)
Setting Up a Foreign Key Relationship Between Tables 18(2)
Adding Data to Our Tables 20(1)
Building the Model 20(14)
LINQ to SQL 21(1)
Adding LINQ to SQL Classes to Our Project 21(1)
Creating Data Model Classes with LINQ to SQL 22(3)
NerdDinnerDataContext Class 25(1)
Creating a DinnerRepository Class 26(2)
Retrieving, Updating, Inserting, and Deleting Using the DinnerRepository Class 28(2)
Integrating Validation and Business Rule Logic with Model Classes 30(4)
Controllers and Views 34(22)
Adding a DinnersController Controller 35(1)
Adding Index and Details Action Methods to the DinnersController Class 36(1)
Understanding ASP.NET MVC Routing 37(2)
Using the DinnerRepository from Our DinnersController 39(1)
Using Views with Our Controller 40(2)
Implementing the ``NotFound'' View Template 42(2)
Implementing the ``Details'' View Template 44(5)
Implementing the ``Index'' View Template 49(5)
Convention-Based Naming and the \Views Directory Structure 54(2)
Create, Update, Delete Form Scenarios 56(30)
URLs Handled by DinnersController 56(1)
Implementing the HTTP-GET Edit Action Method 57(4)
Html.BeginForm and Html.TextBox Html Helper Methods 61(1)
Implementing the HTTP-POST Edit Action Method 62(4)
Handling Edit Errors 66(2)
Understanding ModelState and the Validation HTML Helper Methods 68(2)
Using a AddRuleViolations Helper Method 70(1)
Complete Edit Action Method Implementations 71(1)
Implementing the HTTP-GET Create Action Method 72(2)
Implementing the HTTP-POST Create Action Method 74(4)
Implementing the HTTP-GET Delete Action Method 78(2)
Implementing the HTTP-POST Delete Action Method 80(2)
Model Binding Security 82(1)
CRUD Wrap-Up 83(3)
ViewData and ViewModel 86(6)
Passing Data from Controllers to View Templates 86(1)
Using the ViewData Dictionary 87(2)
Using a ViewModel Pattern 89(3)
Custom-Shaped ViewModel Classes 92(1)
Partials and Master Pages 92(9)
Revisiting Our Edit and Create View Templates 92(1)
Using Partial View Templates 93(4)
Using Partial View Templates to Clarify Code 97(1)
Master Pages 98(3)
Paging Support 101(9)
Index() Action Method Recap 102(1)
Understanding IQueryable<T> 102(1)
Adding a ``page'' Value to the URL 103(3)
Adding Page Navigation UI 106(4)
Authentication and Authorization 110(9)
Understanding Authentication and Authorization 110(1)
Forms Authentication and the AccountController 111(3)
Authorizing the /Dinners/Create URL Using the [Authorize] Filter 114(2)
Using the User.Identity.Name Property When Creating Dinners 116(1)
Using the User.Identity.Name Property When Editing Dinners 116(2)
Showing/Hiding Edit and Delete Links 118(1)
AJAX Enabling RSVPs Accepts 119(8)
Indicating Whether the User Is RSVP'ed 120(2)
Implementing the Register Action Method 122(1)
Calling the Register Action Method Using AJAX 123(2)
Adding a jQuery Animation 125(2)
Cleanup---Refactor out a RSVP Partial View 127(1)
Integrating an AJAX Map 127(18)
Creating a Map Partial View 127(2)
Creating a Map.js Utility Library 129(2)
Integrating the Map with Create and Edit Forms 131(4)
Integrating the Map with the Details View 135(1)
Implementing Location Search in Our Database and Repository 136(4)
Implementing a JSON-Based AJAX Search Action Method 140(1)
Calling the JSON-Based AJAX Method Using jQuery 141(4)
Unit Testing 145(19)
Why Unit Test? 145(1)
NerdDinner.Tests Project 146(1)
Creating Unit Tests for Our Dinner Model Class 147(2)
Running Tests 149(1)
Creating DinnersController Unit Tests 150(2)
Dependency Injection 152(1)
Extracting an IDinnerRepository Interface 152(2)
Updating DinnersController to Support Constructor Injection 154(1)
Creating the FakeDinnerRepository Class 154(3)
Using the FakeDinnerRepository with Unit Tests 157(2)
Creating Edit Action Unit Tests 159(1)
Mocking the User.Identity.Name Property 160(2)
Testing UpdateModel() Scenarios 162(1)
Testing Wrap-Up 163(1)
NerdDinner Wrap-Up 164(1)
Model-View-Controller and ASP.NET 165(10)
What Is Model-View-Controller? 165(2)
MVC on the Web Today 167(3)
Ruby on Rails 168(1)
Django and Python 169(1)
Spring, Struts, and Java 169(1)
Zend Framework and PHP 170(1)
MonoRail 170(1)
ASP.NET MVC: The New Kid on the Block 170(4)
Serving Methods, Not Files 171(1)
Is This Web Forms 4.0? 171(1)
Why Not Web Forms? 172(1)
Cost/Benefit of Web Forms 172(1)
Should You Fear ASP.NET MVC? 173(1)
Summary 174(1)
ASP.NET> ASP.NET MVC 175(22)
Abstraction: What Web Forms Does Well 175(6)
A Basic Web Forms Application 176(4)
The Importance of Events 180(1)
The Leak: Where Web Forms Doesn't Exactly Fit 181(3)
ViewState 183(1)
Controlling Your Angle Brackets 183(1)
Client IDs 183(1)
Testing 183(1)
Back to Basics: ASP.NET MVC Believes... 184(2)
Orchestration versus Composing 184(1)
Separation of Concerns: What It Means 184(1)
Approaches to Maintainability 185(1)
Caring About Testability 186(1)
Common Reactions to ASP.NET MVC 187(1)
This Looks Like Classic ASP from 1999! 187(1)
Who Moved My ``<asp:Cheese runat=``server''> 187(1)
Yet Another Web Framework 188(1)
Why ``(ASP.NET < ASP.NET MVC) == True'' 188(8)
Convention over Configuration 190(4)
Your First, er, Third, Request 194(2)
The Request Lifecycle 196(1)
Summary 196(1)
Routes and URLs 197(28)
Introduction to Routing 198(18)
Compared to URL Rewriting 199(1)
Defining Routes 199(7)
Named Routes 206(1)
Catch-All Parameter 206(2)
StopRoutingHandler 208(1)
Under the Hood: How Routes Generate URLs 209(7)
Under the Hood: How Routes Tie Your URL to an Action 216(1)
The High-Level Request Routing Pipeline 217(1)
Route Matching 217(1)
Advanced Routing with Custom Constraints 217(1)
Route Extensibility 218(4)
Using Routing with Web Forms 222(2)
Summary 224(1)
Controllers 225(26)
History of the Controller 225(2)
Defining the Controller: The IController Interface 227(2)
The ControllerBase Abstract Base Class 229(1)
The Controller Class and Actions 229(4)
Action Methods 230(3)
The ActionResult 233(7)
Action Result Types 235(3)
Action Result Helper Methods 238(1)
Implicit Action Results 239(1)
Action Invoker 240(9)
How an Action Is Mapped to a Method 241(2)
Mapping Parameters 243(1)
Invoking Actions 244(1)
Passing Data to Actions: The Model Binders 244(4)
A Word About User Input 248(1)
Summary 249(2)
Views 251(26)
What a View Does 251(2)
What a View Shouldn't Do 253(1)
Specifying a View 253(2)
Strongly Typed Views 255(2)
HTML Helper Methods 257(9)
HtmlHelper Class and Extension Methods 257(1)
Using the HTML Helpers 258(8)
The View Engine 266(9)
Configuring a View Engine 267(1)
Selecting a View Engine 267(1)
Finding a View 268(1)
The View Itself 269(1)
Alternative View Engines 269(6)
New View Engine or New ActionResult? 275(1)
Summary 275(2)
AJAX 277(28)
When AJAX Is Cool 278(1)
When It's Not 278(2)
AJAX Examples 280(23)
Handling Disabled Scripting 280(4)
Using Partials for Rendering 284(4)
Some Things You May Not Know About Microsoft ASP.NET AJAX 288(2)
Updating an HTML Element When Submitting a Form 290(2)
The Auto-Complete Text Box 292(1)
Implementing Auto-Complete with Microsoft ASP.NET AJAX 292(3)
Filtering Data with a Selectbox 295(1)
The Modal Popup with jQuery 296(1)
The Modal Popup Code 297(2)
The Rating Control 299(4)
Summary 303(2)
Filters 305(20)
Filters Included with ASP.NET MVC 305(11)
Authorize 306(2)
OutputCache 308(2)
Exception Filter 310(1)
Custom Filters 311(5)
Writing a Custom Action Filter 316(1)
Writing a Custom Authorization Filter 317(2)
Writing a Custom Exception Filter 319(1)
Filter Ordering 320(1)
Filter Naming 321(2)
Summary 323(2)
Securing Your Application 325(24)
This Is a War 327(4)
Knowing Your Enemy's Mind 327(4)
Weapons 331(3)
Spam 331(1)
Case Study: Profiting from Evil with the Srizbi and Storm Botnets 332(1)
Digital Stealth Ninja Network 333(1)
Threat: Cross-Site Scripting (XSS) 334(5)
Passive Injection 334(2)
Active Injection 336(2)
Preventing XSS 338(1)
Html.AttributeEncode and Url.Encode 338(1)
Threat: Cross-Site Request Forgery 339(4)
Preventing CSRF Attacks 342(1)
Threat: Cookie Stealing 343(1)
Preventing Cookie Theft with HttpOnly 344(1)
Keeping Your Pants Up: Proper Error Reporting and the Stack Trace 345(1)
Securing Your Controllers, Not Your Routes 345(1)
Using [Authorize] to Look Down Your Action or Controller 346(1)
Using [NonAction] to Protect Public Methods 346(1)
Whitelist From Binding 347(1)
Summary: It's Up to You 348(1)
Test Driven Development with ASP.NET MVC 349(18)
A Brief Introduction to TDD 350(7)
What Does TDD Look Like? 350(3)
Writing Good Unit Tests 353(4)
What Are Some Benefits of Writing Tests? 357(1)
How Do I Get Started? 357(1)
Applying TDD to ASP.NET MVC 357(8)
Testing Routes 358(2)
Testing Controllers 360(1)
Redirecting to Another Action 360(2)
Testing View Helpers 362(2)
Testing Views 364(1)
Summary 365(2)
Testable Design Patterns 367(26)
Why You Should Care About Testability 368(2)
Big Design Up Front (BDUF) 368(1)
Agile Software Development 369(1)
You Want to Write Testable Code 370(1)
Using Tests to Prove You're Done 371(1)
Designing Your Application for Testability 371(5)
Future-Proofing Your Application with Interfaces 371(2)
The Single Responsibility Principle 373(1)
Avoid Using Singletons and Static Methods 373(3)
Testable Data Access 376(7)
Creating the Model 377(2)
The Repository Pattern in Detail 379(4)
Implementing Business Logic with the Service Layer 383(9)
Services Gone Wild 385(1)
Partial Solution: Setting Controller Dependencies Manually 386(6)
Summary 392(1)
Best of Both Worlds: Web Forms and MVC Together 393(28)
How Is It Possible 393(1)
Including MVC in Existing Web Forms Applications 394(4)
Referencing the Required Libraries 394(1)
Creating the Necessary Directories 395(1)
Updating the Web.config 396(2)
Adding Web Forms to an Existing ASP.NET MVC Application 398(4)
The Easy Part: Do Nothing 399(2)
When/Home/Isn't/Home/ 401(1)
Using System.Web.Routing to Route to Web Forms 401(1)
Sharing Data Between Web Forms and MVC 402(5)
Using HTTP POST 402(1)
Using the ASP.NET Session 403(1)
Using Cross-Page Posting 404(2)
Using TempData 406(1)
Migrating from Web Forms to MVC 407(13)
Create an Empty ASP.NET MVC Project with a Test Project 407(1)
Implement the Structure 408(2)
Add Images and Styling 410(1)
Setting Up Routing and Controllers 411(4)
Replacing Complex Server Controls 415(3)
Uploading Files and Working with Images 418(2)
Summary 420(1)
Index 421
Introduction xvii
NerdDinner 1(164)
File New Project 5(8)
Examining the NerdDinner Directory Structure 7(2)
Running the NerdDinner Application 9(3)
Testing the NerdDinner Application 12(1)
Creating the Database 13(7)
Creating a New SQL Server Express Database 14(1)
Creating Tables within Our Database 15(3)
Setting Up a Foreign Key Relationship Between Tables 18(2)
Adding Data to Our Tables 20(1)
Building the Model 20(14)
LINQ to SQL 21(1)
Adding LINQ to SQL Classes to Our Project 21(1)
Creating Data Model Classes with LINQ to SQL 22(3)
NerdDinnerDataContext Class 25(1)
Creating a DinnerRepository Class 26(2)
Retrieving, Updating, Inserting, and Deleting Using the DinnerRepository Class 28(2)
Integrating Validation and Business Rule Logic with Model Classes 30(4)
Controllers and Views 34(22)
Adding a DinnersController Controller 35(1)
Adding Index and Details Action Methods to the DinnersController Class 36(1)
Understanding ASP.NET MVC Routing 37(2)
Using the DinnerRepository from Our DinnersController 39(1)
Using Views with Our Controller 40(2)
Implementing the ``NotFound'' View Template 42(2)
Implementing the ``Details'' View Template 44(5)
Implementing the ``Index'' View Template 49(5)
Convention-Based Naming and the \Views Directory Structure 54(2)
Create, Update, Delete Form Scenarios 56(30)
URLs Handled by DinnersController 56(1)
Implementing the HTTP-GET Edit Action Method 57(4)
Html.BeginForm and Html.TextBox Html Helper Methods 61(1)
Implementing the HTTP-POST Edit Action Method 62(4)
Handling Edit Errors 66(2)
Understanding ModelState and the Validation HTML Helper Methods 68(2)
Using a AddRuleViolations Helper Method 70(1)
Complete Edit Action Method Implementations 71(1)
Implementing the HTTP-GET Create Action Method 72(2)
Implementing the HTTP-POST Create Action Method 74(4)
Implementing the HTTP-GET Delete Action Method 78(2)
Implementing the HTTP-POST Delete Action Method 80(2)
Model Binding Security 82(1)
CRUD Wrap-Up 83(3)
ViewData and ViewModel 86(6)
Passing Data from Controllers to View Templates 86(1)
Using the ViewData Dictionary 87(2)
Using a ViewModel Pattern 89(3)
Custom-Shaped ViewModel Classes 92(1)
Partials and Master Pages 92(9)
Revisiting Our Edit and Create View Templates 92(1)
Using Partial View Templates 93(4)
Using Partial View Templates to Clarify Code 97(1)
Master Pages 98(3)
Paging Support 101(9)
Index() Action Method Recap 102(1)
Understanding IQueryable<T> 102(1)
Adding a ``page'' Value to the URL 103(3)
Adding Page Navigation UI 106(4)
Authentication and Authorization 110(9)
Understanding Authentication and Authorization 110(1)
Forms Authentication and the AccountController 111(3)
Authorizing the /Dinners/Create URL Using the [Authorize] Filter 114(2)
Using the User.Identity.Name Property When Creating Dinners 116(1)
Using the User.Identity.Name Property When Editing Dinners 116(2)
Showing/Hiding Edit and Delete Links 118(1)
AJAX Enabling RSVPs Accepts 119(8)
Indicating Whether the User Is RSVP'ed 120(2)
Implementing the Register Action Method 122(1)
Calling the Register Action Method Using AJAX 123(2)
Adding a jQuery Animation 125(2)
Cleanup---Refactor out a RSVP Partial View 127(1)
Integrating an AJAX Map 127(18)
Creating a Map Partial View 127(2)
Creating a Map.js Utility Library 129(2)
Integrating the Map with Create and Edit Forms 131(4)
Integrating the Map with the Details View 135(1)
Implementing Location Search in Our Database and Repository 136(4)
Implementing a JSON-Based AJAX Search Action Method 140(1)
Calling the JSON-Based AJAX Method Using jQuery 141(4)
Unit Testing 145(19)
Why Unit Test? 145(1)
NerdDinner.Tests Project 146(1)
Creating Unit Tests for Our Dinner Model Class 147(2)
Running Tests 149(1)
Creating DinnersController Unit Tests 150(2)
Dependency Injection 152(1)
Extracting an IDinnerRepository Interface 152(2)
Updating DinnersController to Support Constructor Injection 154(1)
Creating the FakeDinnerRepository Class 154(3)
Using the FakeDinnerRepository with Unit Tests 157(2)
Creating Edit Action Unit Tests 159(1)
Mocking the User.Identity.Name Property 160(2)
Testing UpdateModel() Scenarios 162(1)
Testing Wrap-Up 163(1)
NerdDinner Wrap-Up 164(1)
Model-View-Controller and ASP.NET 165(10)
What Is Model-View-Controller? 165(2)
MVC on the Web Today 167(3)
Ruby on Rails 168(1)
Django and Python 169(1)
Spring, Struts, and Java 169(1)
Zend Framework and PHP 170(1)
MonoRail 170(1)
ASP.NET MVC: The New Kid on the Block 170(4)
Serving Methods, Not Files 171(1)
Is This Web Forms 4.0? 171(1)
Why Not Web Forms? 172(1)
Cost/Benefit of Web Forms 172(1)
Should You Fear ASP.NET MVC? 173(1)
Summary 174(1)
ASP.NET> ASP.NET MVC 175(22)
Abstraction: What Web Forms Does Well 175(6)
A Basic Web Forms Application 176(4)
The Importance of Events 180(1)
The Leak: Where Web Forms Doesn't Exactly Fit 181(3)
ViewState 183(1)
Controlling Your Angle Brackets 183(1)
Client IDs 183(1)
Testing 183(1)
Back to Basics: ASP.NET MVC Believes... 184(2)
Orchestration versus Composing 184(1)
Separation of Concerns: What It Means 184(1)
Approaches to Maintainability 185(1)
Caring About Testability 186(1)
Common Reactions to ASP.NET MVC 187(1)
This Looks Like Classic ASP from 1999! 187(1)
Who Moved My ``<asp:Cheese runat=``server''> 187(1)
Yet Another Web Framework 188(1)
Why ``(ASP.NET < ASP.NET MVC) == True'' 188(8)
Convention over Configuration 190(4)
Your First, er, Third, Request 194(2)
The Request Lifecycle 196(1)
Summary 196(1)
Routes and URLs 197(28)
Introduction to Routing 198(18)
Compared to URL Rewriting 199(1)
Defining Routes 199(7)
Named Routes 206(1)
Catch-All Parameter 206(2)
StopRoutingHandler 208(1)
Under the Hood: How Routes Generate URLs 209(7)
Under the Hood: How Routes Tie Your URL to an Action 216(1)
The High-Level Request Routing Pipeline 217(1)
Route Matching 217(1)
Advanced Routing with Custom Constraints 217(1)
Route Extensibility 218(4)
Using Routing with Web Forms 222(2)
Summary 224(1)
Controllers 225(26)
History of the Controller 225(2)
Defining the Controller: The IController Interface 227(2)
The ControllerBase Abstract Base Class 229(1)
The Controller Class and Actions 229(4)
Action Methods 230(3)
The ActionResult 233(7)
Action Result Types 235(3)
Action Result Helper Methods 238(1)
Implicit Action Results 239(1)
Action Invoker 240(9)
How an Action Is Mapped to a Method 241(2)
Mapping Parameters 243(1)
Invoking Actions 244(1)
Passing Data to Actions: The Model Binders 244(4)
A Word About User Input 248(1)
Summary 249(2)
Views 251(26)
What a View Does 251(2)
What a View Shouldn't Do 253(1)
Specifying a View 253(2)
Strongly Typed Views 255(2)
HTML Helper Methods 257(9)
HtmlHelper Class and Extension Methods 257(1)
Using the HTML Helpers 258(8)
The View Engine 266(9)
Configuring a View Engine 267(1)
Selecting a View Engine 267(1)
Finding a View 268(1)
The View Itself 269(1)
Alternative View Engines 269(6)
New View Engine or New ActionResult? 275(1)
Summary 275(2)
AJAX 277(28)
When AJAX Is Cool 278(1)
When It's Not 278(2)
AJAX Examples 280(23)
Handling Disabled Scripting 280(4)
Using Partials for Rendering 284(4)
Some Things You May Not Know About Microsoft ASP.NET AJAX 288(2)
Updating an HTML Element When Submitting a Form 290(2)
The Auto-Complete Text Box 292(1)
Implementing Auto-Complete with Microsoft ASP.NET AJAX 292(3)
Filtering Data with a Selectbox 295(1)
The Modal Popup with jQuery 296(1)
The Modal Popup Code 297(2)
The Rating Control 299(4)
Summary 303(2)
Filters 305(20)
Filters Included with ASP.NET MVC 305(11)
Authorize 306(2)
OutputCache 308(2)
Exception Filter 310(1)
Custom Filters 311(5)
Writing a Custom Action Filter 316(1)
Writing a Custom Authorization Filter 317(2)
Writing a Custom Exception Filter 319(1)
Filter Ordering 320(1)
Filter Naming 321(2)
Summary 323(2)
Securing Your Application 325(24)
This Is a War 327(4)
Knowing Your Enemy's Mind 327(4)
Weapons 331(3)
Spam 331(1)
Case Study: Profiting from Evil with the Srizbi and Storm Botnets 332(1)
Digital Stealth Ninja Network 333(1)
Threat: Cross-Site Scripting (XSS) 334(5)
Passive Injection 334(2)
Active Injection 336(2)
Preventing XSS 338(1)
Html.AttributeEncode and Url.Encode 338(1)
Threat: Cross-Site Request Forgery 339(4)
Preventing CSRF Attacks 342(1)
Threat: Cookie Stealing 343(1)
Preventing Cookie Theft with HttpOnly 344(1)
Keeping Your Pants Up: Proper Error Reporting and the Stack Trace 345(1)
Securing Your Controllers, Not Your Routes 345(1)
Using [Authorize] to Look Down Your Action or Controller 346(1)
Using [NonAction] to Protect Public Methods 346(1)
Whitelist From Binding 347(1)
Summary: It's Up to You 348(1)
Test Driven Development with ASP.NET MVC 349(18)
A Brief Introduction to TDD 350(7)
What Does TDD Look Like? 350(3)
Writing Good Unit Tests 353(4)
What Are Some Benefits of Writing Tests? 357(1)
How Do I Get Started? 357(1)
Applying TDD to ASP.NET MVC 357(8)
Testing Routes 358(2)
Testing Controllers 360(1)
Redirecting to Another Action 360(2)
Testing View Helpers 362(2)
Testing Views 364(1)
Summary 365(2)
Testable Design Patterns 367(26)
Why You Should Care About Testability 368(2)
Big Design Up Front (BDUF) 368(1)
Agile Software Development 369(1)
You Want to Write Testable Code 370(1)
Using Tests to Prove You're Done 371(1)
Designing Your Application for Testability 371(5)
Future-Proofing Your Application with Interfaces 371(2)
The Single Responsibility Principle 373(1)
Avoid Using Singletons and Static Methods 373(3)
Testable Data Access 376(7)
Creating the Model 377(2)
The Repository Pattern in Detail 379(4)
Implementing Business Logic with the Service Layer 383(9)
Services Gone Wild 385(1)
Partial Solution: Setting Controller Dependencies Manually 386(6)
Summary 392(1)
Best of Both Worlds: Web Forms and MVC Together 393(28)
How Is It Possible 393(1)
Including MVC in Existing Web Forms Applications 394(4)
Referencing the Required Libraries 394(1)
Creating the Necessary Directories 395(1)
Updating the Web.config 396(2)
Adding Web Forms to an Existing ASP.NET MVC Application 398(4)
The Easy Part: Do Nothing 399(2)
When/Home/Isn't/Home/ 401(1)
Using System.Web.Routing to Route to Web Forms 401(1)
Sharing Data Between Web Forms and MVC 402(5)
Using HTTP POST 402(1)
Using the ASP.NET Session 403(1)
Using Cross-Page Posting 404(2)
Using TempData 406(1)
Migrating from Web Forms to MVC 407(13)
Create an Empty ASP.NET MVC Project with a Test Project 407(1)
Implement the Structure 408(2)
Add Images and Styling 410(1)
Setting Up Routing and Controllers 411(4)
Replacing Complex Server Controls 415(3)
Uploading Files and Working with Images 418(2)
Summary 420(1)
Index 421
- 名称
- 类型
- 大小
光盘服务联系方式: 020-38250260 客服QQ:4006604884
云图客服:
用户发送的提问,这种方式就需要有位在线客服来回答用户的问题,这种 就属于对话式的,问题是这种提问是否需要用户登录才能提问
Video Player
×
Audio Player
×
pdf Player
×