覆盖Create()ActionResult?

时间:2011-06-20 20:42:36

标签: asp.net-mvc-3

我正在处理我的“第一个”MVC 3应用程序,并且被以下问题困扰。基本上我有一个联系表单,收集输入并保存到数据库。在列出所有联系人提交的页面上,我希望用户(以后将成为管理员角色)能够从联系人列表页面中选择一个联系人,然后单击“生成客户端”以调用我的ClientController并将此联系人转换为一个客户。 ClientController页面还有一个Create()方法,用于从头开始输入新的Client记录,因此为了避免该方法的复杂性,我尝试创建一个接受contactID作为参数的“Make”操作。

我在联系人列表页面上有以下代码:

@Html.ActionLink("Make Client", "Make", "Client", new { id = item.ID }, null)

客户端控制器如此显示:

    [HttpGet]
    public ActionResult Create()
    {
        return View(new Client());
    }

    //
    // GET: /Make
    //  used for converting a Contact record into a Client
    [HttpGet]
    public ActionResult Make(int contactID)
    {
        try
        {
            var contactModel = _db.Contacts.Single(r => r.ID == contactID);

            var clientModel = new Client()
            {
                FirstName = contactModel.FirstName,
                LastName = contactModel.LastName,
                <snip> . . . ,
                ZipCode = contactModel.ZipCode
            };

            return View(new Client(clientModel));
        }
        catch (Exception ex)
        {

            base.ViewData["Exception"] = "Exception: " + ex.InnerException.ToString();
            throw;
        }
    }

问题是Make(int contactID)中收到的contactID始终为null。我已经能够调整一些东西,通过使用可以为null的int参数调用标准的Create()ActionResult来实现以下工作,但这感觉很好:

    [HttpGet]
    public ActionResult Create(int? id)
    {
        if (id == null)
        {
            return View(new Client());
        }
        else
        {
            return (Make(id));
        }
    }

底线是我可以调用此Create()ActionResult参数不为null,但是当我直接调用Make()时,参数不会传递。 Create()有什么特别之处可以让它起作用吗?

谢谢,我也愿意接受其他选择。

1 个答案:

答案 0 :(得分:3)

Make操作的操作参数称为contactID,因此在生成此操作的链接时,请使用以下名称:

@Html.ActionLink(
    "Make Client", 
    "Make", 
    "Client", 
    new { contactid = item.ID }, 
    null
)

在调用Make操作时,这将成功传递正确的值作为参数。因此,您不再需要Create操作中的调整