MVC Controller方法的参数签名不同

时间:2015-02-18 00:58:08

标签: c# asp.net-mvc

  • MVC 5,.NET 4.5.1

在我的基本Controller类中,我有以下定义的

    [AcceptVerbs(HttpVerbs.Get)]
    public virtual ActionResult Edit(long Id)
    {
    }

到目前为止一切都很好。但是在从上面开始的新控制器类中,我需要将方法签名更改为:

   [AcceptVerbs(HttpVerbs.Get)]
    public new ActionResult Edit(string Id)
    {
    }

请注意,参数Id现在是字符串。但是,当在后代控制器上调用该操作时,我收到以下错误:

  

参数字典包含参数' Id'的空条目。非可空类型的System.Int64' for method' System.Web.Mvc.ActionResult Edit(Int64)'在' XXXX.Controllers.MlControllerGridView`2 [MakersLane.Web.ViewModels.Login.LoginAddEditViewModel,XXXX.Web.ViewModels.Login.LoginAddEditViewModel]'。可选参数必须是引用类型,可空类型,或者声明为可选参数。   参数名称:参数

所以我的问题是如何在我的后代控制器中将参数Id更改为 string 类型而不访问任何基本行为?

1 个答案:

答案 0 :(得分:1)

我通过使用[NonAction]属性解决了这个问题。这样,“long id”被“删除”并正确地获取“string id”版本。不漂亮,但它确实有效。

    public ActionResult Edit(string Id)
    {
        return RedirectToAction("NotYetImplemented", "SystemManagement");
    }

    /// <summary>
    ///     To work around the base class requiredment that the Id be a long we override the
    ///     base class and mark this as not an action. Use the string version instead.
    /// </summary>
    /// <param name="Id"></param>
    /// <returns></returns>
    [NonAction]
    public override ActionResult Edit(long Id)
    {
        return RedirectToAction("NotYetImplemented", "SystemManagement");
    }