>我有一个应用程序,您可以创建一个带有姓名和电子邮件的用户。创建用户时,会将用户添加到数据库中,并为其分配 ID(主键)。
当我创建用户时,函数 RedirectToAction 不会将我重定向到新用户的主页,但仍然会将我重定向到创建该用户的用户,尽管我告诉控制器将我重定向到新创建 ID 的用户主页。
return RedirectToAction("GetUser", "User", new { id = userAdd.ID })
正在创建用户帐户,因为我可以在数据库和用户列表中看到它,因此 AddUser 函数可以工作,似乎只是这行代码不起作用。
我正在将应用程序初始化为第一个 ID (1) 用户的配置文件,然后可以创建另一个用户。
有人可以告诉我这里出了什么问题吗?
路由配置.cs文件指向第一个用户 ID 作为初始化:
routes.MapRoute(
name: "User",
url: "{controller}/{action}/{id}",
defaults: new { controller = "User", action = "GetUser", ID = 1 }
);
添加用户的控制器:
public ActionResult AddUser(UserAdd userAdd)
{
try
{
// TODO: Add insert logic here
userService.AddUser(userAdd);
return RedirectToAction("GetUser", "User", new { id = userAdd.ID });
}
catch
{
return View();
}
}
我的用户DAO和IDAO正在关注。
道:
public void AddUser(User user, TheContext context)
{
context.Users.Add(user);
context.SaveChanges();
}
爱德奥:
void AddUser(User user, TheContext context);
我的用户服务层代码是:
服务:
public void AddUser(UserAdd userAdd)
{
User newUser = new User()
{
Name = userAdd.Name,
Email = userAdd.Email
};
using (var context = new TheContext())
{
userDAO.AddUser(newUser, context);
}
}
服务:
void AddUser(UserAdd userAdd);
GetUser action:
DAO:
public User GetUser(int id, TheContext context)
{
context.Users.Include(h => h.UserDetails).ToList();
return context.Users.Find(id);
}
爱德奥:
User GetUser(int id, TheContext context);
服务:
public User GetUser(int id)
{
using (var context = new TheContext())
{
return userDAO.GetUser(id, context);
}
}
服务:
User GetUser(int id);
控制器:
public ActionResult GetUser(int id)
{
return View(userService.GetUser(id));
}
GetUser.cshtml view:
@model Tester.Data.Models.Domain.User
@{
ViewBag.Title = "GetUser";
}
<h2>My Test App</h2>
<div>
<p>@Html.ActionLink("Register", "AddUser", "User")</p>
</div>
<h2>Details for @Model.Name</h2>
@if (Model.UserDetails.Count != 0)
{
@Html.Partial("~/Views/User/GetUserDetails.cshtml", Model.UserDetails);
}
初始化器类:
protected override void Seed(TheContext context)
{
User user1 = new User();
user1.ID = "1";
user1.Name = "test";
user1.Email = "test@test.com";
context.Users.Add(user1);
UserDetail userDetail1 = new UserDetail();
userDetail1.Name = "test";
userDetail1.Email = "test.com";
context.UserDetails.Add(userDetail1);
context.SaveChanges();
但是我可以使用:
TheContext.Data.Models.Domain.User user = new TheContext.Data.Models.Domain.User();
user.Name = "test";
user.Email = "test@test.com";
TheContext.Data.Models.Domain.UserDetail userDetail = new TheContext.Data.Models.Domain.UserDetail();
userDetail.Name = "test";
userDetail.Email = "test@test.com";
适用于用户的 T-SQL:
CREATE TABLE [dbo].[Users] (
[ID] INT IDENTITY (1, 1) NOT NULL,
[Name] NVARCHAR (MAX) NULL,
[Email] NVARCHAR (MAX) NULL,
CONSTRAINT [PK_dbo.Users] PRIMARY KEY CLUSTERED ([ID] ASC)
);
T-SQL for UserDetails:
CREATE TABLE [dbo].[UserDetails] (
[ID] INT IDENTITY (1, 1) NOT NULL,
[Name] NVARCHAR (MAX) NULL,
[Email] NVARCHAR (MAX) NULL,
[User_ID] INT NULL,
CONSTRAINT [PK_dbo.UserDetails] PRIMARY KEY CLUSTERED ([ID] ASC),
CONSTRAINT [FK_dbo.UserDetails_dbo.Users_User_ID] FOREIGN KEY ([User_ID]) REFERENCES [dbo].[Users] ([ID])
);
用户类:
public class User
{
public int ID { get; set; }
public string Name { get; set; }
public string Email { get; set; }
public virtual ICollection<UserDetail> UserDetails { get; set; }
}
用户详细信息类:
public class UserDetail
{
public int ID { get; set; }
public string Name { get; set; }
public string Email { get; set; }
}
不要使用已发布视图模型中的ID
,而是从服务中获取新创建的记录ID
并使用它。
服务:
int AddUser(UserAdd userAdd);
服务:
public int AddUser(UserAdd userAdd)
{
var userId = 0;
User newUser = new User()
{
Name = userAdd.Name,
Email = userAdd.Email
};
using (var context = new TheContext())
{
userDAO.AddUser(newUser, context);
// assing Id here after add
userId = newUser.ID;
}
return userId;
}
操作方法:
public ActionResult AddUser(UserAdd userAdd)
{
try
{
// capture Id from service
var newId = userService.AddUser(userAdd);
return RedirectToAction("GetUser", "User", new { id = newId });
}
catch
{
return View(userAdd); // return view with posted model so you don't loose data
}
}