如何重定向到详细信息视图?

时间:2014-11-13 02:10:32

标签: asp.net-mvc-3

这是我的LearnController,这是创建。


    [HttpPost]
    public ActionResult Create(Learn learn)
    {
        if (ModelState.IsValid)
        {
            db.Learns.Add(learn);
            db.SaveChanges();
            return RedirectToAction("Details", new { id = learn.ModuleId });
        }

        ViewBag.ModuleId = new SelectList(db.Modules, "ModuleId", "Code", learn.ModuleId);
        return View(learn);
    }

以下是我的LearnController

中的详细信息
 public ViewResult Details(int id)
    {
        var mod = db.Modules.Include("Learns").Single(g => g.ModuleId == id);
        return View(mod);
    }

在我的学习控制器的创建视图中,我放置了一个HTMLActionLink,但似乎无法重定向。我的代码有问题吗?


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

这是错误。

  

参数字典包含非可空类型'System.Int32'的参数'id'的空条目,用于'Module1.Controllers.LearnController'中方法'System.Web.Mvc.ViewResult Details(Int32)'。可选参数必须是引用类型,可空类型,或者声明为可选参数。   参数名称:参数

2 个答案:

答案 0 :(得分:0)

“参数字典包含非可空类型'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
    }
}

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 }) 
按照Stephen Muecke的建议

答案 1 :(得分:0)

链接必须是@Html.ActionLink("Back to List", "Details", new { id = # }),其中#是要显示的Module的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视图包含为Learn创建新Module的链接,其中链接为@Html.ActionLink("Add new Learn", "Create", new { id = Model.ID})

如果您可以从其他视图创建新的Learn(您无权访问ID的{​​{1}}属性),以及创建新视图的位置Module允许您从下拉列表中选择Learn表单,然后您需要javascript / jquery根据所选的Module <更新链接的href值/ p>