1

使用 Visual Studio Express 2012、MVC4 Web 应用程序和 SQL 2008 R2...

我曾经有一个只接受一个参数的存储过程,当我的 MVC 模型包含该存储过程时,我可以成功地从我的存储过程中调用它Controller并获得Json很好的结果。

现在我更新了存储过程以接受两个参数。我刷新了我的 MVC 模型,但在传递两个参数时无法从我的控制器正确调用存储过程。

这是我使用一个参数的旧存储过程和控制器(这有效):

PROCEDURE [dbo].[GetDependencyNodes]     
@CISearchString nvarchar(100)

旧控制器:

namespace CMDB.Controllers
{
public class GoJSDiagramNodesAndLinksController : Controller
{
   private CMDBEntities db = new CMDBEntities();
   public ActionResult GetDependencyNodes(string CISearchString)
    {
        return Json(db.GetDependencyNodes(CISearchString).ToList(), JsonRequestBehavior.AllowGet);
    }
}
}

这是我接受两个参数的新存储过程和控制器:

PROCEDURE [dbo].[GetDependencyNodes]
@CISearchString nvarchar(100),
@ExcludeString nvarchar(100)

新控制器:

namespace CMDB.Controllers
{
public class GoJSDiagramNodesAndLinksController : Controller
{
   private CMDBEntities db = new CMDBEntities();
   public ActionResult GetDependencyNodes(string CISearchString, string ExcludeString)
    {
   return Json(db.GetDependencyNodes(CISearchString, ExcludeString).ToList(), JsonRequestBehavior.AllowGet);
    }
}
}

在 Visual Studio Express 2012 中,我的“return Json”行出现错误,说明:

“int”不包含“ToList”的定义,并且找不到接受“int”类型的第一个参数的扩展方法“ToList”。

如果我从以下位置更改行:

return Json(db.GetDependencyNodes(CISearchString, ExcludeString).ToList(), JsonRequestBehavior.AllowGet);

至:

return Json(db.GetDependencyNodes(CISearchString, ExcludeString).ToString().ToList(), JsonRequestBehavior.AllowGet);

错误消失但控制器返回 -1 而不是正确的 Json 结果。我已经在 SQL Manager 中测试了存储过程,可以看到预期的结果。

这是我的文件 CMDBModels.Desginer.cs 中带有 GetDependencyNodes 的部分代码:

    /// <summary>
    /// No Metadata Documentation available.
    /// </summary>
    /// <param name="cISearchString">No Metadata Documentation available.</param>
    /// <param name="excludeString">No Metadata Documentation available.</param>
    public int GetDependencyNodes(global::System.String cISearchString, global::System.String excludeString)
    {
        ObjectParameter cISearchStringParameter;
        if (cISearchString != null)
        {
            cISearchStringParameter = new ObjectParameter("CISearchString", cISearchString);
        }
        else
        {
            cISearchStringParameter = new ObjectParameter("CISearchString", typeof(global::System.String));
        }

        ObjectParameter excludeStringParameter;
        if (excludeString != null)
        {
            excludeStringParameter = new ObjectParameter("ExcludeString", excludeString);
        }
        else
        {
            excludeStringParameter = new ObjectParameter("ExcludeString", typeof(global::System.String));
        }

        return base.ExecuteFunction("GetDependencyNodes", cISearchStringParameter, excludeStringParameter);
    }

有任何想法吗?

谢谢。

4

1 回答 1

1

有几件事首先将您的数据访问移动到另一个类,使您的控制器尽可能轻。

接下来将存储的采购输出映射到具有与返回的列匹配的属性的基本类(实体类)

这应该让您在调试中更容易查看返回的数据,并且只是良好的编程习惯

于 2013-03-13T16:25:02.470 回答