2012-07-06 79 views
0

另一個MVC問題。MVC模型/上下文工作流程

我正在做一個Web應用程序工具,它​​執行了大量的數據庫請求等。而這一頁給了我很多MVC的鬥爭。

我創建了C#頁面之前,這就是它的樣子 DataSearch

您最多可以顯示彼此相鄰來比較值4個格。

現在MVC,我想解決這個問題是這樣的:

FlowChart

不過,我總是得到隨機錯誤信息通常是基於連接問題......我嘗試了很多不同的東西,所以這就是爲什麼我的代碼現在有點混亂,但這裏是最重要的部分。 (只有兩個選擇例)

VIEW

通行證MainDDL1,SubDDL1,搜索1,MainDDL2,SubDDL2,搜索2(這工作)

控制器

public PartialViewResult getGrid1(string MainDDL1, string SubDDL1, string Search1) 
    { 
     DataSearchModel voModel = new DataSearchModel(); 
     voModel.dtResultSet1 = DLA.DataSearchContext.getResultSet1(MainDDL1, SubDDL1, Search1); 
     return PartialView(MainDDL1, voModel); 
    } 

public PartialViewResult getGrid2(string MainDDL2, string SubDDL2, string Search2) 
{ 
    DataSearchModel voModel = new DataSearchModel(); 
    voModel.dtResultSet2 = DLA.DataSearchContext.getResultSet2(MainDDL2, SubDDL2, Search2); 
    return PartialView(MainDDL2, voModel); 
} 

public ViewResult DataSearch(string text) 
{ 
    DataSearchModel oModel = new DataSearchModel(); 
    oModel.alMainDDL = DLA.DataSearchContext.getMainDDL(); 

    return View(oModel); 
} 

我真的不喜歡我必須使用dtResultSet1和dtResultSet2而不是調用相同的方法。爲什麼我不能只調用getResultSet,dtResultSet等?!由於我創建了新的模型,模型應該有它自己的方法?或者是一個模型不能與對象相比。

型號

宣言dtResultSet1,dtResultSet2,搜索字符串等

語境

 public static DataTable getResultSet1(string sChoice, string sFeat, string sSearch) 
     { 
      return setResultSet1(sChoice, sFeat, sSearch); 
     } 

private static DataTable setResultSet1(string sChoice, string sFeat, string sSearch) 
     { 

      DataTable dtTemp = new DataTable(); 
      string sQuery = setSqlQuery(sChoice, sFeat, sSearch); 

      OleDbConnection dbConnection = null; 
      // Instantiate the Connection Object 
      dbConnection = new OleDbConnection(ConfigurationManager.ConnectionStrings["OracleDataBase"].ConnectionString); 

      //dbConnection.Open(); 
      dbConnection.Open(); 

      OleDbCommand dbCommand = null; 
      // Instantiate the Command Object 
      dbCommand = new OleDbCommand(sQuery, dbConnection); 
      dbCommand.CommandType = CommandType.Text; 

      OleDbDataReader dr = null; 
      // Execute the Stored Procedure 
      dr = dbCommand.ExecuteReader(); 

      dtTemp = setResultSetRows(dtTemp, sChoice, dr); 

      dr.Dispose(); 
      dbConnection.Close(); 

      return dtTemp; 
     } 

private static string setSqlQuery(string sChoice, string sFeat, string sSearch) 
     { 
      switch (sChoice) 
      { 
       case "T_PRCL": 
       case "T_PRCL_FEA": 
       case "T_GIS_PRCL": 
        return "SELECT * FROM " + sChoice + " WHERE " + sFeat + "='" + sSearch + "' and sys_del_flag = 0"; 
       case "SGD_SFC_FEAT": 
       case "MSURFACE": 
       case "SGD_MIN_FEAT": 
       case "MMINERAL": 
        return "SELECT * FROM " + sChoice + " WHERE " + sFeat + "='" + sSearch + "' AND EXPIRY_DATE is NULL"; 
       case "V_SURFACE": 
       case "V_MINERAL": 
        return "SELECT * FROM " + sChoice + " WHERE " + sFeat + "='" + sSearch + "'"; 
       default: 
        return "SELECT sysdate as UNKNOWN_ERROR from dual"; 
      } 
     } 

爲2.一個方法是完全一樣的。這裏再次,我寧願將所有內容都放在一個名爲getResultSet的靜態方法中。此外,我確實有連接作爲全局變量(OleDBConnection = null等)和連接等是自己的方法。這給了我更多的隨機錯誤,只要連接重疊。通常如果一個Reader在另一個之前完成。我不明白,因爲他們是不同的模型(對象)不應該使用自己的獨立變量,對象?!

我希望有人能爲此帶來一些啓示。

+1

你嘗試呢? (第二個答案)http://stackoverflow.com/questions/342613/connection-management-asp-net也許實現連接管理器有助於解決併發問題。 – 2012-07-06 16:19:42

+0

這似乎解決了連接/數據讀取器問題;但是,我不斷收到一個Ajax內部服務器錯誤 – seN 2012-07-06 17:14:59

+0

好吧,明白了。它工作正常。忘了重命名一些東西。我會馬上發佈答案。 – seN 2012-07-06 17:26:23

回答

0

從Pabloker退出Tipp後退房Connection Management ASP.net我能解決我的問題。

以下是守則中最重要的部分。

CONTEXT

public class MyConnectionManager : IDisposable 
     { 
      [ThreadStatic] // static per thread 
      private static OleDbConnection con; 

      public static OleDbConnection Connection 
      { 
       get 
       { 
        if (con == null) 
        { 
         con = new OleDbConnection(ConfigurationManager.ConnectionStrings["OracleDataBase"].ConnectionString); 
         con.Open(); 
        } 
        return con; 
       } 
      } 

      public void Dispose() 
      { 
       if (con != null) 
       { 
        con.Close(); 
       } 
      } 
     } 

private static DataTable setResultSet(string sChoice, string sFeat, string sSearch) 
     { 
      DataTable dtTemp = new DataTable(); 
      string sQuery = setSqlQuery(sChoice, sFeat, sSearch); 

      // Instantiate the Command Object 
      OleDbCommand dbCommand = new OleDbCommand(sQuery, MyConnectionManager.Connection); 
      dbCommand.CommandType = CommandType.Text; 

      // Execute the Stored Procedure 
      OleDbDataReader dr = dbCommand.ExecuteReader(); 

      dtTemp = setResultSetRows(dtTemp, sChoice, dr); 

      return dtTemp; 

    } 

     public static DataTable getResultSet(string sChoice, string sFeat, string sSearch) 
     { 
      return setResultSet(sChoice, sFeat, sSearch); 
     } 

MODEL

public DataTable dtResultSet { get; set; } 

CONTROLLER

public PartialViewResult getGrid1(string MainDDL1, string SubDDL1, string Search1) 
{ 
    DataSearchModel voModel = new DataSearchModel(); 
    voModel.dtResultSet = DLA.DataSearchContext.getResultSet(MainDDL1, SubDDL1, Search1); 
    return PartialView(MainDDL1, voModel); 
} 

public PartialViewResult getGrid2(string MainDDL2, string SubDDL2, string Search2) 
{ 
    DataSearchModel voModel = new DataSearchModel(); 
    voModel.dtResultSet = DLA.DataSearchContext.getResultSet(MainDDL2, SubDDL2, Search2); 
    return PartialView(MainDDL2, voModel); 
} 

VIEW

<script type="text/javascript"> 


    $(document).ready(function() { 

     $.ajaxSetup({ 
      error: function (xhr, status, error) { 
       alert("An AJAX error occured: " + status + "\nError: " + error); 
      } 
     }); 


     $('#btnSubmit').click(function() { 
      var time = new Date().getTime(); // @* unique random number to workaround IE cache issue - IE will cache the ajax if you don't use this *@ 
      var oMainDDL1 = $('#MainDDL1').data("tComboBox"); 
      var oSubDDL1 = $('#SubDDL1').data("tComboBox"); 
      var sSearch1 = $("#Search1").val(); 

      var oMainDDL2 = $('#MainDDL2').data("tComboBox"); 
      var oSubDDL2 = $('#SubDDL2').data("tComboBox"); 
      var sSearch2 = $("#Search2").val(); 


      var actionURL = '@Url.Action("getGrid1", "DataSearch", new { MainDDL1 = "PLACEHOLDER" })'.replace('PLACEHOLDER', oMainDDL1.value()) + "&SubDDL1=" + oSubDDL1.value() + "&Search1=" + sSearch1 + "&time=" + time; 
      if (actionURL != null) { 
       alert('actionURL'); 
       $.get(actionURL, function (data) { 
        $('#result1').fadeOut('slow', 'linear', function() { $('#result1').empty(); $('#result1').append(data); }); 
        $('#result1').fadeIn('slow', 'linear', function() { 
         if ($.browser.msie) { 
          this.style.removeAttribute('filter'); // @* Needed to fix IE7 cleartype bug with jQuery fade, but will crap out on FF/Chrome *@ 
         } 
        }); 
       }); 
      } 

      actionURL = '@Url.Action("getGrid2", "DataSearch", new { MainDDL2 = "PLACEHOLDER" })'.replace('PLACEHOLDER', oMainDDL2.value()) + "&SubDDL2=" + oSubDDL2.value() + "&Search2=" + sSearch2 + "&time=" + time; 
      if (actionURL != null) { 
       alert('actionURL'); 
       $.get(actionURL, function (data) { 
        $('#result2').fadeOut('slow', 'linear', function() { $('#result2').empty(); $('#result2').append(data); }); 
        $('#result2').fadeIn('slow', 'linear', function() { 
         if ($.browser.msie) { 
          this.style.removeAttribute('filter'); // @* Needed to fix IE7 cleartype bug with jQuery fade, but will crap out on FF/Chrome *@ 
         } 
        }); 
       }); 
      } 
     }); 
    }); 

    function onMainDDL1Change(e) { 
     var combo = $("#SubDDL1").data("tComboBox"); 
     combo.value(""); 
     combo.reload(); 
    } 

    function onSubDDL1DataBinding(e) { 
     var combo = $("#MainDDL1").data("tComboBox"); 
     e.data = $.extend({}, e.data, { mainDDL1ID: combo.value() }); 
    } 

    function onMainDDL2Change(e) { 
     var combo = $("#SubDDL2").data("tComboBox"); 
     combo.value(""); 
     combo.reload(); 
    } 

    function onSubDDL2DataBinding(e) { 
     var combo = $("#MainDDL2").data("tComboBox"); 
     e.data = $.extend({}, e.data, { mainDDL2ID: combo.value() }); 
    } 
</script> 

<table> 
    <tr> 
     <td> 
      @(Html.Telerik().ComboBox() 
       .Name("MainDDL1") 
       .AutoFill(true) 
       .DataBinding(binding => binding.Ajax().Select("LoadMainDDL", "DataSearch")) 
       .HighlightFirstMatch(true) 
       .ClientEvents(events => events.OnChange("onMainDDL1Change")) 
       ) 
     </td> 
     <td> 
      @(Html.Telerik().ComboBox() 
       .Name("MainDDL2") 
       .AutoFill(true) 
       .DataBinding(binding => binding.Ajax().Select("LoadMainDDL", "DataSearch")) 
       .HighlightFirstMatch(true) 
       .ClientEvents(events => events.OnChange("onMainDDL2Change")) 
       ) 
     </td> 
    </tr> 
    <tr> 
     <td> 
      @(Html.Telerik().ComboBox() 
       .Name("SubDDL1") 
       .DataBinding(binding => binding.Ajax().Select("LoadSubDDL1", "DataSearch")) 
       .HighlightFirstMatch(true) 
       .ClientEvents(events => events.OnDataBinding("onSubDDL1DataBinding")) 
       ) 
     </td> 
     <td> 
      @(Html.Telerik().ComboBox() 
       .Name("SubDDL2") 
       .DataBinding(binding => binding.Ajax().Select("LoadSubDDL2", "DataSearch")) 
       .HighlightFirstMatch(true) 
       .ClientEvents(events => events.OnDataBinding("onSubDDL2DataBinding")) 
       ) 
     </td> 
    </tr> 
    <tr> 
     <td> 
      @Html.TextBox("Search1") 
     </td> 
     <td> 
      @Html.TextBox("Search2") 
     </td> 
    </tr> 
    <tr align="center"> 
     <td colspan="4"> 
     <input type="button" class="t-button button1" value="Search" id="btnSubmit" /> 
     </td> 
    </tr> 
</table> 

<div id="result1"> 
</div> 
<div id="result2"> 
</div> 

局部視圖 - 例如

@model ...DataSearchModel 

@(Html.Telerik().Grid(Model.dtResultSet) 
.Name("Grid") 
.Footer(false) 
.Columns(columns => 
{ 
columns.Bound(o => o.Row[0]).Title("T_PRCL"); 
}))