2012-07-06 6 views
0

또 다른 MVC 질문.MVC 모델/컨텍스트 작업 흐름

많은 데이터베이스 요청 등을하는 웹 응용 프로그램 도구에서 작업하고 있습니다. 그리고이 한 페이지는 MVC에서 많은 어려움을 겪고 있습니다.

내가 전에 C#에서 페이지를 생성하고 당신은 값을 비교하기 위해 서로 옆에 4 그리드에 표시 할 수 있습니다 DataSearch

처럼 보이는 방법입니다.

지금 MVC에서 나는이 방법으로 문제 해결에 대해 생각했다 : 난 항상 연결 문제에 따라 일반적으로 무작위 오류 메시지를 얻을 그러나

FlowChart

... 그래서 다른 많은 것들을 시도 내 코드가 지금 당황 스럽기는하지만 바로 여기가 가장 중요한 부분입니다. (단 2의 선택과 예)

VIEW

정말 MainDDL1, SubDDL1, Search1, MainDDL2, SubDDL2, Search2 (이 작동)

CONTROLLER

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

I을 전달합니다 싫어하는 것은 dtResultSet1과 dtResultSet2를 같은 메소드를 호출하는 대신 사용해야한다는 것입니다. 왜 그냥 getResultSet, dtResultSet 등을 호출 할 수 없습니까? 새 모델을 만들 때 모델에는 자체 메서드가 있어야합니다. 또는 모델은 객체와 비교할 수 없습니다. dtResultSet1, dtResultSet2위한

모델

선언 검색 문자열 등

컨텍스트 2. 하나

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

방법 .. 여기서 다시 정확히 동일 , 나는 getResultSet이라는 하나의 정적 메서드에 모든 것을 넣는 것을 선호합니다. 또한 나는 Connection을 전역 변수 (OleDBConnection = null 등)로 가지고 있었고 연결 등은 자체 방법이었다. 연결이 겹칠 때마다 이것은 더 많은 임의의 오류를 발생 시켰습니다. 일반적으로 하나의 리더가 다른 리더보다 먼저 수행 된 경우. 내가 이해하지 못하는 것은 서로 다른 모델 (객체)들이 자신의 독립 변수, 객체를 사용해서는 안되기 때문입니다.

누군가가이 문제에 대해 의견을 나눌 수 있기를 바랍니다.

+1

당신이 시도 했습니까? (두 번째 대답) http://stackoverflow.com/questions/342613/connection-management-asp-net 아마 연결 관리자를 구현하면 동시성 문제를 해결하는 데 도움이됩니다. –

+0

이것이 Connection/DataReader 문제를 해결 한 것 같습니다. 그러나, 나는 계속 Ajax 내부 서버 오류가 발생합니다. – seN

+0

알겠습니다. 괜찮 았어. 방금 뭔가 이름을 변경하는 것을 잊었습니다. 나는 곧바로 대답을 게시 할 것이다. – seN

답변

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