首页 文章

MVC4:存储过程带有多个参数

提问于
浏览
0

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

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

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

Here is my old stored procedure and controller using one parameter (this works):

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

Old Controller:

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);
    }
}
}

Here is my new stored procedure and controller accepting two parameters:

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

New Controller:

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中,我在“返回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);
    }

有任何想法吗?

谢谢 .

1 回答

  • 1

    有些事情首先将您的数据访问移动到另一个类,让您的控制器尽可能轻 .

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

    这应该让你更容易看看调试中返回的数据,这只是一个很好的编程实践

相关问题