.Net MVC4 使用心得(五)细节问题Url.Action和Html.ActionLink

本文详细探讨了MVC框架下Url.Action方法的使用陷阱,特别是当action设置为当前路径时,routeValues如何意外继承的问题,并提供了解决方案。包括手动删除id路由、直接传空的routeValues等方法,最终给出了一种简洁高效的实现方式,避免了不必要的复杂操作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

     很久没时间研究了,今天再次摸起。感觉,mvc稍有不留神就会陷入一个有一个的坑。

     说一个今天遇到而网上未找到相关资料的问题吧:在View或者Controller中使用Url.Action时(跟Html.ActionLink可以实现差不多功能),如果action设置的是不同于当前action的,不会有任何问题。如果设置的正是当前的action,会出现灰常疼的情况。你明明没有填写routeValues参数,可是如果之前你访问的页面routeValues不为空的话,这些routeValues会自动继承过来,引入到你的action里。

    比如,如果使用Url.Action("Index"), 正常来讲应该路由到 /Home/Index。可是,如果我当前的位置为/Home/Index/1的话,你会惊奇的发现Url.Action("Index")的值为/Home/Index/1!!!

    疼痛难忍,研究了一下,配置路由、新建规则,不行,因为id是默认加上去的,再怎么配他还是在。

直接传空的routeValues 用

Url.Action("Index", new { })
也不行,新建的空路由表,不会覆盖原先的路由。

看来只有手动删除id的路由了。

可行的方法是在controller里,针对这个,把对id的路由删掉写成这样:

RouteValueDictionary rvd = RouteData.Values;
            rvd.Remove("id");
            ViewBag.allprourl = Url.Action("Index", rvd);

然后到view里绑定:

<a href="@ViewBag.allprourl"><img src="http://www.xxx.com/pro.jpg" /></a>

不过,真心不想这么麻烦。本来在view上直接写一下就好了,非要到controller里写一下(view上也可以写代码块,不过不推荐),然后通过viewbag去view绑定。费时费力费空间。

干脆在view上直接这样写

<a href="@Url.Action("Index",new {id=""})"><img src="http://www.xxx.com/pro.jpg" /></a>

问题解决了,这次路由到了/Home/Index(因为是默认,所以其实路由到的是/)
系统框架: (1)普通用户功能: 个人资料管理:用户通过注册登录创建个人资料,包括基本信息(如身高、体重、年龄、性别等)以及健康目标(如减肥、增肌等)。系统将根据这些信息为用户定制个性化的饮食建议。 食物数据库:提供详细的食物营养成分信息,包括每种食物的卡路里、营养成分(如蛋白质、脂肪、碳水化合物等)、过敏源等。用户可以方便地查询食物信息,并记录每日摄入量。 饮食记录:用户每天记录自己的饮食情况,系统根据饮食记录自动计算卡路里摄入量,并生成数据报告,帮助用户评估饮食是否符合健康标准。 个性化推荐:利用机器学习算法分析用户的饮食习惯、健康目标以及运动数据,提供个性化的饮食推荐。系统根据用户的实时需求(如减肥、增肌等)调整推荐策略,确保用户获取最合适的饮食建议。 社交平台:用户可以在平台上与其他用户分享饮食经验、健身心得、进展数据等,互相鼓励、互动,增强健康管理的持续性积极性。 (2)管理者功能: 用户管理:管理者可以查看所有用户的基本资料、健康目标饮食记录等信息,帮助指导用户提供个性化的饮食建议。管理者还可以对用户进行管理,如禁用或删除不符合规定的账户。 食物数据库管理:理者可以添加、编辑删除食物数据库中的食物信息,确保数据库内容的准确性时效性。也可以管理食物的过敏源营养成分数据。 饮食记录监控:管理者可以查看所有用户的饮食记录,分析整体饮食趋势,发现异常或不健康的饮食习惯,并提供改进建议或通知相关用户。 个性化推荐策略调整:管理者可以根据大数据分析调整推荐算法或策略,优化个性化饮食建议的效果,提升用户体验。根据平台发展需求,管理者可调整推荐规则算法。 内容审核与社交平台管理:管理者负责平台上用户分享内容的审核,确保用户发布的内容不违反规定。管理者可以删除不合规的帖子,并为用户提供引导,确保平台的积极健康氛围。 (3)系统安全与权限管理: 普通用户 只能查看管理自己的个人资料、饮食记录等。 可以在平台上分享自己的经验进展。 获取个性化的饮食推荐健康建议。 管理者 拥有对所有用户数据、食物数据库、饮食记录等的查看管理权限。我想完成有这些功能的app,并且有管理员管理系统。可以根据我的系统功能要求实现更加详细的第一阶段:开发管理员管理系统(使用 SQL Server Visual Studio)吗?我需要详细步骤详细的代码,现在我的数据库已经按照你给的 1. 创建 Users 表 CREATE TABLE Users ( UserID INT PRIMARY KEY IDENTITY(1,1), Name NVARCHAR(100), Age INT, Gender NVARCHAR(10), -- 可以是 Male, Female, Other 等 Height DECIMAL(5,2), -- 身高(单位:厘米) Weight DECIMAL(5,2), -- 体重(单位:千克) Goal NVARCHAR(50), -- 健康目标(例如:减肥、增肌等) Email NVARCHAR(100) UNIQUE, PasswordHash NVARCHAR(255), -- 存储密码的哈希值 RegistrationDate DATETIME DEFAULT GETDATE() -- 注册日期 ); GO -- 2. 创建 Foods 表 CREATE TABLE Foods ( FoodID INT PRIMARY KEY IDENTITY(1,1), Name NVARCHAR(100), Calories DECIMAL(5,2), -- 每100克的卡路里 Protein DECIMAL(5,2), -- 每100克的蛋白质(克) Fat DECIMAL(5,2), -- 每100克的脂肪(克) Carbs DECIMAL(5,2), -- 每100克的碳水化合物(克) Category NVARCHAR(50), -- 食物类别(例如:水果、蔬菜、肉类等) ImageUrl NVARCHAR(255) -- 食物图片的URL ); GO -- 3. 创建 UserGoals 表(此时引用的 Users 表已经创建) CREATE TABLE UserGoals ( GoalID INT PRIMARY KEY IDENTITY(1,1), UserID INT FOREIGN KEY REFERENCES Users(UserID), Goal NVARCHAR(50),
最新发布
03-21
<think>嗯,用户的问题是关于如何在Visual Studio中使用SQL Server构建一个具有管理员功能的应用程序,管理用户表、食物表目标表。首先,我需要理清用户的需求,他们可能希望从数据库设计到应用程序开发的完整流程。用户提到了详细的步骤代码示例,所以回答需要结构清晰,分步骤讲解。 首先,我应该考虑数据库设计部分。用户提到了用户表、食物表目标表,可能需要每个表的字段。例如,用户表可能有用户ID、用户名、密码、角色等;食物表包括食物ID、名称、卡路里等;目标表可能有目标ID、用户ID、目标类型数值。需要确保每个表的主键外键正确设置,比如目标表的UserID外键关联到用户表的UserID。 接下来是环境准备。用户需要在Visual Studio中安装SQL Server Data Tools (SSDT),引用中提到了如何在VS2017安装SSDT,可能需要指导用户通过安装程序添加该组件。同时,确保SQL Server实例已安装,并且用户有权限创建数据库。 然后是创建数据库项目。在VS中新建SQL Server数据库项目,添加表结构的SQL脚本,比如CREATE TABLE语句。可能需要给出具体的SQL示例,包括主键、外键约束。 接下来是应用程序开发部分,用户需要一个管理系统,可能使用C#ASP.NET MVC或WinForms。需要选择合适的技术栈,这里假设使用ASP.NET MVC,因为Web应用比较常见。需要配置连接字符串,使用Entity Framework Core进行ORM映射,这样代码示例会更清晰。 然后分步骤讲解如何创建模型、DbContext,以及CRUD操作。例如,用户管理部分,需要展示如何创建ControllerView,实现增删改查。代码示例应包括数据访问层的代码,比如使用EF Core查询用户列表,添加新用户等。 此外,管理员功能可能需要身份验证授权,这里需要提到ASP.NET Core Identity,但用户的问题可能更侧重于基础功能的实现,所以可能需要简化这部分,或者建议用户集成Identity以实现安全管理。 最后,测试部署的步骤,指导用户如何运行应用程序,进行功能测试,并发布到IIS或Azure。 需要确保每个步骤的代码示例正确,比如连接字符串的格式,DbContext的配置,Controller中的Action方法等。同时,注意引用中提到的SSDT在VS中的集成开发环境,所以在数据库项目部分要强调使用SSDT来管理数据库架构。 可能还需要考虑用户对T-SQL的熟悉程度,是否需要更多的SQL脚本示例,比如存储过程或视图,但根据问题描述,用户可能更倾向于使用ORM,所以重点放在EF Core上。 总结下来,回答的结构应该是:环境准备、数据库设计、创建数据库项目、应用程序开发(模型、数据访问、界面)、代码示例、测试部署,最后相关问题。确保每个部分详细且代码正确,符合用户要求的详细步骤样例。</think>### 分步骤解决方案 #### 一、环境准备 1. **安装SQL Server Data Tools (SSDT)** - 在Visual Studio 2017/2019中,通过`工具 > 获取工具功能`,勾选`SQL Server Data Tools`完成安装[^1] - 验证安装:新建项目时能看到`SQL Server > SQL Server Database Project`模板 2. **创建数据库项目** - 新建`SQL Server Database Project`,右键项目选择`导入 > 数据库`,连接现有数据库生成架构脚本 #### 二、数据库设计(示例表结构) ```sql -- 用户表 (Users) CREATE TABLE [dbo].[Users] ( [UserID] INT PRIMARY KEY IDENTITY(1,1), [Username] NVARCHAR(50) NOT NULL UNIQUE, [Password] NVARCHAR(100) NOT NULL, -- 建议存储哈希值 [Role] NVARCHAR(20) DEFAULT 'User' ); -- 食物表 (Foods) CREATE TABLE [dbo].[Foods] ( [FoodID] INT PRIMARY KEY IDENTITY(1,1), [Name] NVARCHAR(100) NOT NULL, [Calories] DECIMAL(10,2), [Protein] DECIMAL(10,2) ); -- 目标表 (Goals) CREATE TABLE [dbo].[Goals] ( [GoalID] INT PRIMARY KEY IDENTITY(1,1), [UserID] INT FOREIGN KEY REFERENCES Users(UserID), [TargetType] NVARCHAR(50), -- 如"每日卡路里" [Value] DECIMAL(10,2) ); ``` #### 三、应用程序开发(ASP.NET MVC示例) 1. **创建ASP.NET MVC项目** - 使用`ASP.NET Web Application (.NET Framework)`模板 - 添加`Entity Framework` NuGet包 2. **配置连接字符串** ```xml <!-- Web.config --> <connectionStrings> <add name="AdminContext" connectionString="Server=.;Database=YourDB;Integrated Security=True;" providerName="System.Data.SqlClient"/> </connectionStrings> ``` 3. **创建数据模型与DbContext** ```csharp public class AdminContext : DbContext { public AdminContext() : base("name=AdminContext") { } public DbSet<User> Users { get; set; } public DbSet<Food> Foods { get; set; } public DbSet<Goal> Goals { get; set; } } public class User { public int UserID { get; set; } [Required] public string Username { get; set; } [Required] public string Password { get; set; } public string Role { get; set; } } ``` 4. **实现管理员功能(示例:用户管理)** ```csharp // UsersController.cs public class UsersController : Controller { private AdminContext db = new AdminContext(); // 用户列表 public ActionResult Index() { return View(db.Users.ToList()); } // 创建用户 [HttpPost] public ActionResult Create(User user) { if (ModelState.IsValid) { db.Users.Add(user); db.SaveChanges(); return RedirectToAction("Index"); } return View(user); } } ``` #### 四、界面实现(Razor视图示例) ```html @* Views/Users/Index.cshtml *@ <table class="table"> <tr> <th>用户名</th> <th>角色</th> <th>操作</th> </tr> @foreach (var item in Model) { <tr> <td>@item.Username</td> <td>@item.Role</td> <td> @Html.ActionLink("编辑", "Edit", new { id=item.UserID }) | @Html.ActionLink("删除", "Delete", new { id=item.UserID }) </td> </tr> } </table> ``` #### 、部署与测试 1. 通过SSDT生成数据库发布脚本,部署到SQL Server 2. 在IIS或Azure上发布Web应用 3. 测试CRUD操作: ```csharp // 示例:添加新用户 using (var db = new AdminContext()) { var newUser = new User { Username = "admin", Password = BCrypt.Net.BCrypt.HashPassword("123456"), Role = "Admin" }; db.Users.Add(newUser); db.SaveChanges(); } ```
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值