Asp.net mvc ASP.NET MVC重定向到操作赢得';不要将我重定向到新ID
我有一个应用程序,你可以创建一个有名字和电子邮件的用户。创建用户时,会将其添加到数据库中,并为其分配一个ID(主键) 创建用户时,函数RedirectToAction不会将我重定向到新用户的主页,但仍会将我重定向到创建该用户的用户,尽管我告诉控制器将我重定向到新创建的ID的用户主页Asp.net mvc ASP.NET MVC重定向到操作赢得';不要将我重定向到新ID,asp.net-mvc,Asp.net Mvc,我有一个应用程序,你可以创建一个有名字和电子邮件的用户。创建用户时,会将其添加到数据库中,并为其分配一个ID(主键) 创建用户时,函数RedirectToAction不会将我重定向到新用户的主页,但仍会将我重定向到创建该用户的用户,尽管我告诉控制器将我重定向到新创建的ID的用户主页 return RedirectToAction("GetUser", "User", new { id = userAdd.ID }) 在数据库和用户列表中可以看到,
return RedirectToAction("GetUser", "User", new { id = userAdd.ID })
在数据库和用户列表中可以看到,用户帐户正在创建中,因此AddUser函数可以工作,但这行代码似乎不起作用
我正在将应用程序初始化为第一个ID(1)用户的配置文件,然后可以创建另一个用户
有人能告诉我这里出了什么问题吗
Routeconfig.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(UserAdd userAdd)
{
User newUser = new User()
{
Name = userAdd.Name,
Email = userAdd.Email
};
using (var context = new TheContext())
{
userDAO.AddUser(newUser, context);
}
}
public User GetUser(int id)
{
using (var context = new TheContext())
{
return userDAO.GetUser(id, context);
}
}
iSeries设备:
void AddUser(UserAdd userAdd);
User GetUser(int id);
获取用户操作:道: 爱多: 服务:
public void AddUser(UserAdd userAdd)
{
User newUser = new User()
{
Name = userAdd.Name,
Email = userAdd.Email
};
using (var context = new TheContext())
{
userDAO.AddUser(newUser, context);
}
}
public User GetUser(int id)
{
using (var context = new TheContext())
{
return userDAO.GetUser(id, context);
}
}
iSeries设备:
void AddUser(UserAdd userAdd);
User GetUser(int id);
控制器:
public ActionResult GetUser(int id)
{
return View(userService.GetUser(id));
}
GetUser.cshtml视图:
@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);
}
然而,我可以使用:
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:
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])
);
用户类别:
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();
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; }
}
不要从发布视图模型中使用
ID
,而是从服务中获取新创建记录的ID
,并使用它
iSeries设备:intadduser(useradduseradd)代码>
服务:
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
}
}
行动方法:
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
}
}
您知道在返回RedirectToAction(“GetUser”,“User”,new{id=userAdd.id})行时,您的userAdd.id是否具有有效值吗?正如我所见,它从未被分配过。您仅将值从它指定给另一个实例的属性。尝试从void AddUser(UserAdd UserAdd)返回Id;在iSeries中,并在控制器中使用它。RedirectToAction代码看起来不错。@Dave我不确定,有没有办法检查它是否被赋值?至于iSeries设备和服务,我已经实现了void AddUser(UserAdd UserAdd,int ID)。对于控制器,我将actionresult编辑为(UserAdd UserAdd,int ID),并返回值ID(userService.AddUser(UserAdd,ID))。这些编辑并没有真正起作用,所以我感觉您的ID没有被赋值,这是正确的。请你进一步解释一下好吗?我已经查看了数据库,我创建的用户在那里被分配了一个ID值,因为它是表中的主键。您可以在return RedirectToAction(“GetUser”,“user”,new{ID=userAdd.ID})
call上设置断点,查看添加用户后,userAdd.ID
是否有新的ID值。如果其中没有值,则需要更新IService.void AddUser(UserAdd UserAdd)
返回int/string
而不是void
。在该方法中声明一个变量,在创建用户后,从newUser
实例中分配该变量并将其返回给控制器。在RedirectToAction
调用中,使用返回值作为id。我无法在此处格式化代码,因此很遗憾,我无法将其发布到此处。@Dave谢谢您告诉我。所以我可以看到分配的userAdd.ID是1,这就是为什么我要快速进入ID1的页面。您知道当我将ID作为主键时,为什么会将其分配为1,因为当我查看数据库时,会分配ID值2。可能是当您使用用户ID 1登录时,会将其传递并保存到viewmodel中。因此,当您发布请求时,保存在该viewmodel中的ID 1也会被传递回控制器,该控制器以后从未更新过。正如我之前所建议的,从您的服务中返回一个新的ID并使用它。@Sergey我读了您的答案。这并不能解决问题。在您建议的调用中,return GetUser(userAdd.ID)
ID始终为1,因此OP再次看到相同的页面。根据OP的描述,RedirectToAction()不是问题。你只是用不同的方式写了同样的东西。在这里,我们需要为新添加的记录获取更新的Id。字符串AddUser(UserAdd UserAdd)返回字符串,但Id应为int。并且所有AddUser代码都没有做任何新的操作,只添加了一个错误。使用重定向而不只是调用操作是一个错误。@Sergey我在不知道数据类型时发布了一个答案,因此代码中有注释://假设主键的类型为string
,当Id为1时,我看不到与下面的结果有任何区别<代码>返回GetUser(userAdd.ID)返回重定向到操作(“GetUser”,“User”,new{ID=newId})代码>它们最终都从数据库中获取相同的用户。它是如何解决这个问题的?如果您阅读了有问题的第二段,问题不在于重定向根本不起作用。它再次重定向到同一用户。OP需要重定向到新用户。我刚刚将主键数据类型更改为字符串,它最初是int-id,但现在是string-id。我使用了您的代码,在UserService中发现错误:“'UserService.AddUser(UserAdd)':并非所有代码路径都返回值”。如果有帮助的话,我正在使用一个类初始化第一个用户和一些细节,我有两个选项,你能建议哪一个更合适,或者如果它们本质上是相同的。我已经用报纸编辑了这篇文章details@DAVID对不起,是打字错误。方法应在末尾返回userId。更新了我的答案。您不需要更改PK的数据类型。如果您这样做了,请确保服务中的AddUser()方法返回相同的数据类型。