第4章ASP.NET MVC (控制器与动作)

一、      接受输入

1、         从context对象获取数据

2、         使用Action方法

3、         使用模型类接受数据

二、      产生输出

1、         理解ActionResult

ActionResult是所有action返回类型的基类,所以在NVC中所有的返回类型是使用ActionResult,不需要再关心返回的是ViewResult或RedirectResult等类型

2、         通过呈现View返回Html

Retum View(“视图名”)

3、         从Action方法向View传递数据

ViewData[Key]=value 传递数据

TempData[Key]=value

ViewBag 参数名=value

View[参数]

4、         执行重定向

A、        重定向到文本URL

B、        重定向到路由系统URL

C、        重定向到Action方法

5、         返回文本数据

6、         返回XML数据

7、         返回JSON数据

8、         返回文件和二进制数据

本章内容结合第三章知识点实现用户登入,后台首页,产品管理

一、在“LinqServer”项目添加“ADO.NET实体模型”名为“Users.edmx”

如图所示:

二、选择”数据库生成“

如图所示:

三、选择“新建查询”,然后登入选择数据库

如图所示:

四、命名好模型名,点击下一步

如图所示:

五、完成后,选择“Users”表,命名好类名

如图所示:

六、在“LinBLL”项目添加一个"类",名为“UsersBll.cs”,编辑登入方法

如图所示:

代码示例:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

using LinqService;
namespace LinqBLL
{
    public class UsersBll
    {
        //通过用户名获取用户数据
        public Users GetUserByUserName(string userName)
        {
            using(var db=new UsersEntities1())
            {
                var user = db.Users.FirstOrDefault(a => a.LoginId == userName);
                return user;
            }
        }
    }
}
View Code

七、找到“Controllers”控制器文件里"AccountController.cs"类,找到“LogOn”方法注释掉里面方法

       编辑用户登入方法

如图所示:

代码示例:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using System.Web.Routing;
using System.Web.Security;
using MvcProduct.Models;

using LinqBLL;
using LinqService;
namespace MvcProduct.Controllers
{
    public class AccountController : Controller
    {

        //
        // GET: /Account/LogOn

        public ActionResult LogOn()
        {
            return View();
        }

        //
        // POST: /Account/LogOn

        [HttpPost]
        public ActionResult LogOn(LogOnModel model, string returnUrl)
        {
            #region 原创
            //if (ModelState.IsValid)
            //{
            //    if (Membership.ValidateUser(model.UserName, model.Password))
            //    {
            //        FormsAuthentication.SetAuthCookie(model.UserName, model.RememberMe);
            //        if (Url.IsLocalUrl(returnUrl) && returnUrl.Length > 1 && returnUrl.StartsWith("/")
            //            && !returnUrl.StartsWith("//") && !returnUrl.StartsWith("/\"))
            //        {
            //            return Redirect(returnUrl);
            //        }
            //        else
            //        {
            //            return RedirectToAction("Index", "Home");
            //        }
            //    }
            //    else
            //    {
            //        ModelState.AddModelError("", "提供的用户名或密码不正确。");
            //    }
            //}

            //// 如果我们进行到这一步时某个地方出错,则重新显示表单
            //return View(model); 
            #endregion
            UsersBll bll = new UsersBll();
            Users info = bll.GetUserByUserName(model.UserName);
            if (info != null && info.LogPwd == model.Password)
            {
                FormsAuthentication.SetAuthCookie(model.UserName, model.RememberMe);
                return Redirect("/Areas/Home/Index");
            }
            return View(model);
        }

        //
        // GET: /Account/LogOff

        public ActionResult LogOff()
        {
            FormsAuthentication.SignOut();

            return RedirectToAction("Index", "Home");
        }

        //
        // GET: /Account/Register

        public ActionResult Register()
        {
            return View();
        }

        //
        // POST: /Account/Register

        [HttpPost]
        public ActionResult Register(RegisterModel model)
        {
            if (ModelState.IsValid)
            {
                // 尝试注册用户
                MembershipCreateStatus createStatus;
                Membership.CreateUser(model.UserName, model.Password, model.Email, null, null, true, null, out createStatus);

                if (createStatus == MembershipCreateStatus.Success)
                {
                    FormsAuthentication.SetAuthCookie(model.UserName, false /* createPersistentCookie */);
                    return RedirectToAction("Index", "Home");
                }
                else
                {
                    ModelState.AddModelError("", ErrorCodeToString(createStatus));
                }
            }

            // 如果我们进行到这一步时某个地方出错,则重新显示表单
            return View(model);
        }

        //
        // GET: /Account/ChangePassword

        [Authorize]
        public ActionResult ChangePassword()
        {
            return View();
        }

        //
        // POST: /Account/ChangePassword

        [Authorize]
        [HttpPost]
        public ActionResult ChangePassword(ChangePasswordModel model)
        {
            if (ModelState.IsValid)
            {

                // 在某些出错情况下,ChangePassword 将引发异常,
                // 而不是返回 false。
                bool changePasswordSucceeded;
                try
                {
                    MembershipUser currentUser = Membership.GetUser(User.Identity.Name, true /* userIsOnline */);
                    changePasswordSucceeded = currentUser.ChangePassword(model.OldPassword, model.NewPassword);
                }
                catch (Exception)
                {
                    changePasswordSucceeded = false;
                }

                if (changePasswordSucceeded)
                {
                    return RedirectToAction("ChangePasswordSuccess");
                }
                else
                {
                    ModelState.AddModelError("", "当前密码不正确或新密码无效。");
                }
            }

            // 如果我们进行到这一步时某个地方出错,则重新显示表单
            return View(model);
        }

        //
        // GET: /Account/ChangePasswordSuccess

        public ActionResult ChangePasswordSuccess()
        {
            return View();
        }

        #region Status Codes
        private static string ErrorCodeToString(MembershipCreateStatus createStatus)
        {
            // 请参见 http://go.microsoft.com/fwlink/?LinkID=177550 以查看
            // 状态代码的完整列表。
            switch (createStatus)
            {
                case MembershipCreateStatus.DuplicateUserName:
                    return "用户名已存在。请输入不同的用户名。";

                case MembershipCreateStatus.DuplicateEmail:
                    return "该电子邮件地址的用户名已存在。请输入不同的电子邮件地址。";

                case MembershipCreateStatus.InvalidPassword:
                    return "提供的密码无效。请输入有效的密码值。";

                case MembershipCreateStatus.InvalidEmail:
                    return "提供的电子邮件地址无效。请检查该值并重试。";

                case MembershipCreateStatus.InvalidAnswer:
                    return "提供的密码取回答案无效。请检查该值并重试。";

                case MembershipCreateStatus.InvalidQuestion:
                    return "提供的密码取回问题无效。请检查该值并重试。";

                case MembershipCreateStatus.InvalidUserName:
                    return "提供的用户名无效。请检查该值并重试。";

                case MembershipCreateStatus.ProviderError:
                    return "身份验证提供程序返回了错误。请验证您的输入并重试。如果问题仍然存在,请与系统管理员联系。";

                case MembershipCreateStatus.UserRejected:
                    return "已取消用户创建请求。请验证您的输入并重试。如果问题仍然存在,请与系统管理员联系。";

                default:
                    return "发生未知错误。请验证您的输入并重试。如果问题仍然存在,请与系统管理员联系。";
            }
        }
        #endregion
    }
}
View Code

八、在这里,因为添加“user”模型,所以还编辑配置文件,找到“APP.config”用户代码复制到"wed.config"里面

1、如图所示(APP.config):

代码示例:

<?xml version="1.0" encoding="utf-8"?>
<configuration>
  <configSections>
    <!-- For more information on Entity Framework configuration, visit http://go.microsoft.com/fwlink/?LinkID=237468 -->
    <section name="entityFramework" type="System.Data.Entity.Internal.ConfigFile.EntityFrameworkSection, EntityFramework, Version=4.4.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" requirePermission="false" />
  </configSections>
  <connectionStrings>
    <add name="SportsStoreEntities" connectionString="metadata=res://*/Product.csdl|res://*/Product.ssdl|res://*/Product.msl;provider=System.Data.SqlClient;provider connection string=&quot;data source=.;initial catalog=SportsStore;user id=sa;MultipleActiveResultSets=True;App=EntityFramework&quot;" providerName="System.Data.EntityClient" />
    <add name="UsersEntities1" connectionString="metadata=res://*/Users.csdl|res://*/Users.ssdl|res://*/Users.msl;provider=System.Data.SqlClient;provider connection string=&quot;data source=.;initial catalog=SportsStore;user id=sa;MultipleActiveResultSets=True;App=EntityFramework&quot;" providerName="System.Data.EntityClient" />
  </connectionStrings>
  <entityFramework>
    <defaultConnectionFactory type="System.Data.Entity.Infrastructure.LocalDbConnectionFactory, EntityFramework">
      <parameters>
        <parameter value="v11.0" />
      </parameters>
    </defaultConnectionFactory>
  </entityFramework>
</configuration>
View Code

2、如图所示(wed.config

代码示例:

<?xml version="1.0" encoding="utf-8"?>
<!--
  有关如何配置 ASP.NET 应用程序的详细信息,请访问
  http://go.microsoft.com/fwlink/?LinkId=152368
  -->
<configuration>
  <configSections>
    <!-- For more information on Entity Framework configuration, visit http://go.microsoft.com/fwlink/?LinkID=237468 -->
    <section name="entityFramework" type="System.Data.Entity.Internal.ConfigFile.EntityFrameworkSection, EntityFramework, Version=4.4.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" requirePermission="false" />
  </configSections>
  <appSettings>
    <add key="webpages:Version" value="1.0.0.0" />
    <add key="ClientValidationEnabled" value="true" />
    <add key="UnobtrusiveJavaScriptEnabled" value="true" />
  </appSettings>
  <system.web>
    <compilation debug="true" targetFramework="4.0" />
    <authentication mode="Forms">
      <forms loginUrl="~/Account/LogOn" timeout="2880" />
    </authentication>
    <pages>
      <namespaces>
        <add namespace="System.Web.Helpers" />
        <add namespace="System.Web.Mvc" />
        <add namespace="System.Web.Mvc.Ajax" />
        <add namespace="System.Web.Mvc.Html" />
        <add namespace="System.Web.Routing" />
        <add namespace="System.Web.WebPages" />
      </namespaces>
    </pages>
    <profile defaultProvider="DefaultProfileProvider">
      <providers>
        <add name="DefaultProfileProvider" type="System.Web.Providers.DefaultProfileProvider, System.Web.Providers, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" connectionStringName="DefaultConnection" applicationName="/" />
      </providers>
    </profile>
    <membership defaultProvider="DefaultMembershipProvider">
      <providers>
        <add name="DefaultMembershipProvider" type="System.Web.Providers.DefaultMembershipProvider, System.Web.Providers, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" connectionStringName="DefaultConnection" enablePasswordRetrieval="false" enablePasswordReset="true" requiresQuestionAndAnswer="false" requiresUniqueEmail="false" maxInvalidPasswordAttempts="5" minRequiredPasswordLength="6" minRequiredNonalphanumericCharacters="0" passwordAttemptWindow="10" applicationName="/" />
      </providers>
    </membership>
    <roleManager defaultProvider="DefaultRoleProvider">
      <providers>
        <add name="DefaultRoleProvider" type="System.Web.Providers.DefaultRoleProvider, System.Web.Providers, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" connectionStringName="DefaultConnection" applicationName="/" />
      </providers>
    </roleManager>
    <!--
            If you are deploying to a cloud environment that has multiple web server instances,
            you should change session state mode from "InProc" to "Custom". In addition,
            change the connection string named "DefaultConnection" to connect to an instance
            of SQL Server (including SQL Azure and SQL  Compact) instead of to SQL Server Express.
      -->
    <sessionState mode="InProc" customProvider="DefaultSessionProvider">
      <providers>
        <add name="DefaultSessionProvider" type="System.Web.Providers.DefaultSessionStateProvider, System.Web.Providers, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" connectionStringName="DefaultConnection" />
      </providers>
    </sessionState>
  </system.web>
  <system.webServer>

    <!--解决转义字符-->
    <security>
      <requestFiltering allowDoubleEscaping="true"></requestFiltering>
    </security>
    
    <validation validateIntegratedModeConfiguration="false" />
    <modules runAllManagedModulesForAllRequests="true" />
  </system.webServer>
  <runtime>
    <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
      <dependentAssembly>
        <assemblyIdentity name="System.Web.Mvc" publicKeyToken="31bf3856ad364e35" />
        <bindingRedirect oldVersion="1.0.0.0-2.0.0.0" newVersion="3.0.0.0" />
      </dependentAssembly>
    </assemblyBinding>
  </runtime>
  <entityFramework>
    <defaultConnectionFactory type="System.Data.Entity.Infrastructure.LocalDbConnectionFactory, EntityFramework">
      <parameters>
        <parameter value="v11.0" />
      </parameters>
    </defaultConnectionFactory>
  </entityFramework>
  <!--<connectionStrings>
    <add name="DefaultConnection" providerName="System.Data.SqlClient" connectionString="Data Source=(LocalDb)v11.0;Initial Catalog=aspnet-MvcProduct-20170103151428;Integrated Security=SSPI;AttachDBFilename=|DataDirectory|aspnet-MvcProduct-20170103151428.mdf" />
  </connectionStrings>-->
  <connectionStrings>
    <add name="SportsStoreEntities" connectionString="metadata=res://*/Product.csdl|res://*/Product.ssdl|res://*/Product.msl;provider=System.Data.SqlClient;provider connection string=&quot;data source=.;initial catalog=SportsStore;user id=sa;password=sa;MultipleActiveResultSets=True;App=EntityFramework&quot;" providerName="System.Data.EntityClient" />
    <add name="UsersEntities1" connectionString="metadata=res://*/Users.csdl|res://*/Users.ssdl|res://*/Users.msl;provider=System.Data.SqlClient;provider connection string=&quot;data source=.;initial catalog=SportsStore;user id=sa;password=sa;MultipleActiveResultSets=True;App=EntityFramework&quot;" providerName="System.Data.EntityClient" />
  </connectionStrings>
</configuration>
View Code

 运用效果:

登入成功:

 九、完成登入,现在实现后台管理

       复制一份“_Layout.cshtml”文件到“Areas/Areas/Views/Shared”文件夹里或者新建,并编辑“_Layout.cshtml”文件

如图所示:

代码示例:

<!DOCTYPE html>
<html>
<head>
    <title>@ViewBag.Title</title>
      <link href="@Url.Content("~/Content/Product.css")" rel="stylesheet" type="text/css" />
    <link href="@Url.Content("~/Content/Site.css")" rel="stylesheet" type="text/css" />
    <script src="@Url.Content("~/Scripts/jquery-1.7.1.min.js")" type="text/javascript"></script>
</head>
<body>
    <div class="page">
        <div id="header">
            <div id="title">
                <h1>在线后台管理体育产品</h1>
            </div>
            <div id="logindisplay">
                @Html.Partial("_LogOnPartial")
            </div>
            <div id="menucontainer">
                <ul id="menu">
                    <li>@Html.ActionLink("首页", "Index", "Home")</li>
                     <li>@Html.ActionLink("体育管理", "List", "Store", new {Area="Areas" },null)</li>
                    <li>@Html.ActionLink("退出", "LogOff", "Account", new  {Area="" },null)</li>
                </ul>
            </div>
        </div>

        <div id="main">
            <div id="categories">
                @{Html.RenderAction("Menu", "Nav");}
            </div>
           <div id="content">
                @RenderBody()
           </div>
        </div>
    </div>
</body>
</html>
View Code

 十、在“Area/Area/Controllers/”文件里添加一个"控制器"名为"StoreController.cs"并调用方法

如图所示:

代码示例:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;

using LinqService;
using LinqBLL;
namespace MvcProduct.Areas.Areas.Controllers
{
    public class StoreController : Controller
    {
        ProductBll bll = new ProductBll();
        //
        // GET: /Areas/Store/

        public ActionResult Index()
        {
            return View();
        }
        public ActionResult List()
        {
            IEnumerable<Product> products = bll.GetProduct();
            return View(products);
        }
    }
}
View Code

十一、在"List"里添加"视图",并选择“/Areas/Areas/Views/Shared/_Layout.cshtml”模板

如图所示:

十二、添加成功后继续编辑前台代码

如图所示:

代码示例:

@model IEnumerable<LinqService.Product>

@{
    ViewBag.Title = "List";
    Layout = "~/Areas/Areas/Views/Shared/_Layout.cshtml";
}

<h2>体育列表</h2>
<p>
    @Html.ActionLink("新增", "Create")
</p>
@{
    var grid = new WebGrid(source: Model, rowsPerPage: 10);
  }

@grid.GetHtml(tableStyle:"grid",
headerStyle:"header",
rowStyle:"row",
footerStyle:"footer",
alternatingRowStyle:"altRow",
columns:grid.Columns(
grid.Column("名称",format:@<text>@Html.ActionLink((string)item.Name,"Details",
"Product",new{id=item.ProductID},new{style="txt-decoration:none;"})</text>),

grid.Column("Name","名称",style:"textCol"),
grid.Column("Price","价格",style:"numberCol",
format:@<text>$@string.Format("{0:F2}",item.Price)</text>),
grid.Column("Category","类型",style:"dateCol"),
grid.Column(format:(item)=>Html.ActionLink("","Edit",new {id=item.ProductID})),
grid.Column(format:(item)=>Html.ActionLink("","Delete",new {id=item.ProductID},new
{onclick="return confirm('你确认删除吗?"+item.ProductID+"')"}))
))
View Code

注意:因为把前台改后,必须要去“/Areas/Areas/Views/Shared/_Layout.cshtml”里面注释掉代码,否则报错

如图所示:

代码示例:

<!DOCTYPE html>
<html>
<head>
    <title>@ViewBag.Title</title>
      <link href="@Url.Content("~/Content/Product.css")" rel="stylesheet" type="text/css" />
    <link href="@Url.Content("~/Content/Site.css")" rel="stylesheet" type="text/css" />
    <script src="@Url.Content("~/Scripts/jquery-1.7.1.min.js")" type="text/javascript"></script>
</head>
<body>
    <div class="page">
        <div id="header">
            <div id="title">
                <h1>在线后台管理体育产品</h1>
            </div>
            <div id="logindisplay">
                @Html.Partial("_LogOnPartial")
            </div>
            <div id="menucontainer">
                <ul id="menu">
                    <li>@Html.ActionLink("首页", "Index", "Home")</li>
                     <li>@Html.ActionLink("体育管理", "List", "Store", new {Area="Areas" },null)</li>
                    <li>@Html.ActionLink("退出", "LogOff", "Account", new  {Area="" },null)</li>
                </ul>
            </div>
        </div>

        <div id="main">
           @* <div id="categories">
                @{Html.RenderAction("Menu", "Nav");}
            </div>*@
           <div id="content">
                @RenderBody()
           </div>
        </div>
    </div>
</body>
</html>
View Code

运行效果:

十三、完成后,实现“删除”功能,到“LinBLL”编辑删除方法

如图所示:

代码示例:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

using LinqService;  //引用
namespace LinqBLL
{
    public class ProductBll
    {
        public List<Product> GetProduct()
        {
            using (SportsStoreEntities se = new SportsStoreEntities())
            {
                var products = se.Product;  //数据库里面表名称
                return products.ToList();
            }
        }
        //通过分类名获取体育产品列表
        public List<Product> GetProductByCateName(string cate,int stIndex,int count)
        {
            using(SportsStoreEntities se=new SportsStoreEntities())
            {
                if (string.IsNullOrEmpty(cate))  //查找所有
                { 
                    var products=se.Product.OrderBy(x=>x.ProductID).Skip(stIndex).Take(count);
                    return products.ToList();
                }
                  else  //查找对应分类数据
                {
                    var books = from a in se.Product                           
                                where a.Category.Contains(cate)
                                select a;
                    return books.OrderBy(x=>x.ProductID).Skip(stIndex).Take(count).ToList();
                }
            }
        }
        //获取所有记录数
        public int GetRecordCount(string cate)
        {
            using (SportsStoreEntities se = new SportsStoreEntities())
            {
                if (string.IsNullOrEmpty(cate))  //查找所有
                {                
                    return se.Product.Count();
                }
                else  //查找对应分类数据
                {
                    var books = from a in se.Product
                                where a.Category.Contains(cate)
                                select a;
                    return books.Count();
                }
            }
        }
        //获取分类名称集
        public IEnumerable<string> GetCategories()
        {
            var se = new SportsStoreEntities();
            var s = from a in se.Product
                    select new { a.Category };
            //Distinct:去掉重复分类名,OrderBy:升序
            return s.Select(x => x.Category).Distinct().OrderBy(x => x);
        }

        //删除方法
        public bool Delete(int id)
        {
            bool b = true;
            using (var st = new SportsStoreEntities())
            {
                try
                {
                    var product = st.Product.SingleOrDefault(a => a.ProductID == id);
                    st.Product.Remove(product);
                    st.SaveChanges();
                }
                catch
                {
                    b = false;
                }
                return b;
            }

        }
    }
}
View Code

十四、到“/Areas/Areas/Controllers/StoreController.cs”调用删除方法

如图所示:

代码示例:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;

using LinqService;
using LinqBLL;
namespace MvcProduct.Areas.Areas.Controllers
{
    public class StoreController : Controller
    {
        ProductBll bll = new ProductBll();
        //
        // GET: /Areas/Store/

        public ActionResult Index()
        {
            return View();
        }
        public ActionResult List()
        {
            IEnumerable<Product> products = bll.GetProduct();
            return View(products);
        }
        //删除
        public ActionResult Delete(int id)
        {
            bll.Delete(id);
            return RedirectToAction("List", "Store");
        }
    }
}
View Code

 十五、完成删除方法,实现信息详细方法,在“LinBLL”里“ProductBll.cs”类编辑信息详细方法

如图所示:

代码示例:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

using LinqService;  //引用
namespace LinqBLL
{
    public class ProductBll
    {
        public List<Product> GetProduct()
        {
            using (SportsStoreEntities se = new SportsStoreEntities())
            {
                var products = se.Product;  //数据库里面表名称
                return products.ToList();
            }
        }
        //通过分类名获取体育产品列表
        public List<Product> GetProductByCateName(string cate,int stIndex,int count)
        {
            using(SportsStoreEntities se=new SportsStoreEntities())
            {
                if (string.IsNullOrEmpty(cate))  //查找所有
                { 
                    var products=se.Product.OrderBy(x=>x.ProductID).Skip(stIndex).Take(count);
                    return products.ToList();
                }
                  else  //查找对应分类数据
                {
                    var books = from a in se.Product                           
                                where a.Category.Contains(cate)
                                select a;
                    return books.OrderBy(x=>x.ProductID).Skip(stIndex).Take(count).ToList();
                }
            }
        }
        //获取所有记录数
        public int GetRecordCount(string cate)
        {
            using (SportsStoreEntities se = new SportsStoreEntities())
            {
                if (string.IsNullOrEmpty(cate))  //查找所有
                {                
                    return se.Product.Count();
                }
                else  //查找对应分类数据
                {
                    var books = from a in se.Product
                                where a.Category.Contains(cate)
                                select a;
                    return books.Count();
                }
            }
        }
        //获取分类名称集
        public IEnumerable<string> GetCategories()
        {
            var se = new SportsStoreEntities();
            var s = from a in se.Product
                    select new { a.Category };
            //Distinct:去掉重复分类名,OrderBy:升序
            return s.Select(x => x.Category).Distinct().OrderBy(x => x);
        }

        //删除方法
        public bool Delete(int id)
        {
            bool b = true;
            using (var st = new SportsStoreEntities())
            {
                try
                {
                    var product = st.Product.SingleOrDefault(a => a.ProductID == id);
                    st.Product.Remove(product);
                    st.SaveChanges();
                }
                catch
                {
                    b = false;
                }
                return b;
            }

        }
        //信息详细
        public Product GetModel(int id)
        {
            using (SportsStoreEntities st = new SportsStoreEntities())
            {
                Product model = st.Product.SingleOrDefault(a => a.ProductID == id);
                    return model;
            }
        }
    }
}
View Code

十六、到“/Areas/Areas/Controllers/StoreController.cs”调用删信息详细方法

如图所示:

代码示例:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;

using LinqService;
using LinqBLL;
namespace MvcProduct.Areas.Areas.Controllers
{
    public class StoreController : Controller
    {
        ProductBll bll = new ProductBll();
        //
        // GET: /Areas/Store/

        public ActionResult Index()
        {
            return View();
        }
        public ActionResult List()
        {
            IEnumerable<Product> products = bll.GetProduct();
            return View(products);
        }
        //删除
        public ActionResult Delete(int id)
        {
            bll.Delete(id);
            return RedirectToAction("List", "Store");
        }
        //信息详细
        public ActionResult GetModel(int id)
        {
            return View(bll.GetModel(id));
        }
    }
}
View Code

十七、在“GetModel”方法里"添加视图",勾选“强类型”选择相对应项目,选择相对应模板

1、如图所示(选择模板):

2、如图所示(全部选择)

十八、添加成功后编辑前台代码与绑定数据

如图所示:

代码示例:

@model LinqService.Product

@{
    ViewBag.Title = "GetModel";
    Layout = "~/Areas/Areas/Views/Shared/_Layout.cshtml";
}

<h2>体育产品详细信息</h2>
<fieldset>
    <legend> 体育信息</legend>
    <div class="display-label">名字:@Model.Name</div>
     <div class="display-label">类型:@Model.Category</div>
     <div class="display-label">价格:@String.Format("{0:F}",Model.Price)</div>
    
     <div class="display-label">简介:@Model.nDescription</div>
     <div class="display-label">图片:</div>
    <div  class="display-label"><img src="/@Model.Image" alt="" /></div>
</fieldset>
<p>
    @Html.ActionLink("编辑", "Edit", new { id=Model.ProductID }) |
    @Html.ActionLink("返回", "Index")
</p>
View Code

注意:因为模板名字叫“GetModel.cshtml”,所以要到“/Areas/Areas/Views/Store/List.cshtml”模板调用该名称否则就点击不了详细产品

如图所示:

代码示例:

@model IEnumerable<LinqService.Product>

@{
    ViewBag.Title = "List";
    Layout = "~/Areas/Areas/Views/Shared/_Layout.cshtml";
}

<h2>体育列表</h2>
<p>
    @Html.ActionLink("新增", "Create")
</p>
@{
    var grid = new WebGrid(source: Model, rowsPerPage: 10);
  }

@grid.GetHtml(tableStyle:"grid",
headerStyle:"header",
rowStyle:"row",
footerStyle:"footer",
alternatingRowStyle:"altRow",
columns:grid.Columns(
grid.Column("名称",format:@<text>@Html.ActionLink((string)item.Name,"GetModel",
"Store",new{id=item.ProductID},new{style="txt-decoration:none;"})</text>),

grid.Column("Name","名称",style:"textCol"),
grid.Column("Price","价格",style:"numberCol",
format:@<text>$@string.Format("{0:F2}",item.Price)</text>),
grid.Column("Category","类型",style:"dateCol"),
grid.Column(format:(item)=>Html.ActionLink("","Edit",new {id=item.ProductID})),
grid.Column(format:(item)=>Html.ActionLink("","Delete",new {id=item.ProductID},new
{onclick="return confirm('你确认删除吗?"+item.ProductID+"')"}))
))
View Code

运行结果:

原文地址:https://www.cnblogs.com/xuyangyang/p/6373177.html