Asp.net mvc ASP.NET MVC重定向到操作赢得';不要将我重定向到新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 }) 在数据库和用户列表中可以看到,

我有一个应用程序,你可以创建一个有名字和电子邮件的用户。创建用户时,会将其添加到数据库中,并为其分配一个ID(主键)

创建用户时,函数RedirectToAction不会将我重定向到新用户的主页,但仍会将我重定向到创建该用户的用户,尽管我告诉控制器将我重定向到新创建的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()方法返回相同的数据类型。