1

Visual Studio Express 2012、MVC4 Webアプリケーション、およびSQL2008R2を使用する...

以前は、1つのパラメーターのみを受け入れるストアドプロシージャがありましたが、MVCモデルにそのストアドプロシージャが含まれていると、自分からそれを正常に呼び出して、問題なく結果Controllerを得ることができましたJson

これで、2つのパラメーターを受け入れるようにストアドプロシージャを更新しました。MVCモデルを更新しましたが、2つのパラメーターを渡すときに、コントローラーからストアドプロシージャを正しく呼び出すことができません。

これが私の古いストアドプロシージャとコントローラーで、1つのパラメーターを使用しています(これは機能します)。

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

これが私の新しいストアドプロシージャとコントローラーで、2つのパラメーターを受け入れます。

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で、「returnJson」行に次のようなエラーが表示されます。

「int」には「ToList」の定義が含まれておらず、「int」型の最初の引数を受け入れる拡張メソッド「ToList」が見つかりませんでした。

次の行を変更した場合:

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

に:

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

エラーはなくなりますが、コントローラーは正しいJson結果ではなく-1を返します。SQL Managerでストアドプロシージャをテストしましたが、期待される結果を確認できます。

GetDependencyNodesを使用したファイルCMDBModels.Desginer.csの部分的なコードは次のとおりです。

    /// <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 に答える