Asp.net mvc 3 如何重定向到详细信息视图?

Asp.net mvc 3 如何重定向到详细信息视图?,asp.net-mvc-3,Asp.net Mvc 3,这是我的LearnControl,这是创建 以下是我的LearnController中的详细信息 在学习控制器的创建视图中,我放置了一个HTMLActionLink,但似乎无法重定向。我的密码有问题吗 这就是错误所在 参数字典包含“Module1.Controllers.LearnController”中方法“System.Web.Mvc.ViewResult DetailsInt32”的非null类型“System.Int32”的参数“id”的null条目。可选参数必须是引用类型、可为null

这是我的LearnControl,这是创建

以下是我的LearnController中的详细信息 在学习控制器的创建视图中,我放置了一个HTMLActionLink,但似乎无法重定向。我的密码有问题吗

这就是错误所在


参数字典包含“Module1.Controllers.LearnController”中方法“System.Web.Mvc.ViewResult DetailsInt32”的非null类型“System.Int32”的参数“id”的null条目。可选参数必须是引用类型、可为null的类型或声明为可选参数。 参数名称:参数


参数字典包含不可为空的类型“System.Int32”的参数“id”的空条目,参数应为可为空的类型,请更改为

public ViewResult Details(int? id)
{
    try
    {
      if (id.HasValue)
      {
        var mod = db.Modules.Include("Learns").Single(g => g.ModuleId == id);
        if (mod == null) 
          throw new ArgumentException("Invalid ID");
        return View(mod);
      }
      else
      {
        throw new ArgumentException("Invalid ID");
      }
    }
    catch (ArgumentException ex)
    {
      return View(new Modules());  // assumed Details view model is Modules class
    }
    catch 
    {
      return View(new Modules());  // assumed Details view model is Modules class
    }
}

更新

我想我误解了你的问题,你需要做的就是改变

@Html.ActionLink("Back to List", "Details" })

正如Stephen Muecke所建议的,链接必须是@Html.ActionLinkBack to List,Details,new{id=},其中是要显示的模块的id。因此,当您创建一个新的Learn时,GET方法应该是

public ActionResult Create(int ID) // ID is the ModuleId your creating the Learn for
{
  Learn model = new Learn();
  model.ModuleID = ID;
  return View(model);
}
在我看来

@model Learn
....
@Html.ActionLink("Back to List", "Details", new { id = Model.ModuleID })
这是假设Details视图包含一个为模块创建新学习的链接,其中的链接是@Html.actionlinkaddnewlearn,create,new{id=Model.id}


如果您可以从其他视图创建一个新的学习,您无权访问模块的ID属性,并且创建新学习的视图允许您从下拉列表中选择模块,然后,您需要javascript/jquery根据所选模块更新链接的href值

您是否可以检查ModuleId在DB中定义为Nullable?如果是,你需要更改它。它背后的主要原因是你在details方法中将id作为参数传递,并且你在那里传递模块id,因此它与参数名称不匹配。你应该传递id not ModuleId谢谢各位,我现在就尝试:DThank you soo我现在就尝试该方法这不允许用户导航回详细信息查看链接将始终引发异常!上面的代码是用于详细操作的,而不是用于创建操作帖子,它只是一个示例,我实例了一个模块对象,并在异常捕获时传递给视图,异常可能发生在详细视图中,这取决于视图中将使用模块对象的哪些属性。@bsting,但它根本没有解决OP的问题。为什么有int?身份证件该方法用于查看现有模块的详细信息,该模块将具有一个ID,因此使其可为null并测试null是必要的pointless@StephenMueckeOP的问题是@Html.ActionLinkBack to List,由于参数id=为空,无法加载详细信息,我想说在服务器站点测试参数并不是毫无意义的,这是为了处理意外的行为,以防客户端试图发送一个不是整数值的id。非常感谢。你帮了我很多@Stephen MueckeA一些旁注我不知道你的模型,所以我做了一些假设:你问题中的Details方法显示了模块的细节,包括它的学习对象集合,所以这个方法应该真正在ModuleController中。在传递ID的Details或Edit GET方法中,您应该像以前一样从数据库中获取对象,然后首先测试其是否为null用户可能在地址栏中输入了无效ID,如果是,则返回新的HttpNotFoundResult;斯蒂芬先生,你能给我解释一下代码是如何工作的吗@Stephen@FaizEverywhere,您不理解哪一位代码?放置在GET方法中的代码
public ViewResult Details(string id)
{
    try
    {
      int intId;
      if(int.TryParse(id, out intId))
      {
        var mod = db.Modules.Include("Learns").Single(g => g.ModuleId == intId);
        if (mod == null) throw new ArgumentException("Invalid ID");
        return View(mod);
      }
      else
      {
        throw new ArgumentException("Invalid ID");
      }
    }
    catch (ArgumentException ex)
    {
      return View(new Modules());  // assumed Details view model is Modules class
    }
    catch 
    {
      return View(new Modules());  // assumed Details view model is Modules class
    }
}
@Html.ActionLink("Back to List", "Details" })
@Html.ActionLink("Back to List", "Details", new { id = Model.ModuleId }) 
public ActionResult Create(int ID) // ID is the ModuleId your creating the Learn for
{
  Learn model = new Learn();
  model.ModuleID = ID;
  return View(model);
}
@model Learn
....
@Html.ActionLink("Back to List", "Details", new { id = Model.ModuleID })