ASP.NET MVC 重定向到操作不会将我重定向到新 ID



>我有一个应用程序,您可以创建一个带有姓名和电子邮件的用户。创建用户时,会将用户添加到数据库中,并为其分配 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
}
}

最新更新