2017-11-02 17 views
0

バックエンドのWebメソッドに渡すjavascript変数のページに、多数の入力への参照を格納しようとしています。私のページは、ページが読み込まれたときに2つの隠れたフォームの1つをプルアップしてデータで満たしているだけなので、入力の値の一部は「未定義」です。これにより、私のwebmethodが呼び出されることのないデータベースを更新するエラーが発生します。言い換えればgetElementById()。値戻り値なし

const fields = { 
        name: '<%=eventFormName.ClientID%>', 
        type: '<%=eventFormType.ClientID%>', 
        subjectLineSD: '<%=eventFormSubjectLineSD.ClientID%>', 
        summarySD: '<%=eventFormSummarySD.ClientID%>', 
        resourcesAffectedSD: '<%=eventFormResourcesAffectedSD.ClientID%>', 
        peopleAffectedSD: '<%=eventFormPeopleAffectedSD.ClientID%>', 
        workAroundSD: '<%=eventFormWorkAroundSD.ClientID%>', 
        startTimeSD: '<%=eventFormStartTimeSD.ClientID%>', 
        endTimeSD: '<%=eventFormEstimatedTimeOfResolutionSD.ClientID%>', 
        subjectLinePO: '<%=eventFormSubjectLinePO.ClientID%>', 
        summaryPO: '<%=eventFormSummaryPO.ClientID%>', 
        resourcesAffectedPO: '<%=eventFormResourcesBeingChangedPO.ClientID%>', 
        changeBenefitsPO: '<%=eventFormChangeBenefitsPO.ClientID%>', 
        impactOnEndUsersPO: '<%=eventFormImpactOnEndUsersPO.ClientID%>', 
        startTimePO: '<%=eventFormProposedStartDatePO.ClientID%>', 
        endTimePO: '<%=eventFormProposedEndDatePO.ClientID%>', 
       } 

       const values = Object.keys(fields).map((key) => { 
        const elm = document.getElementById(fields[key]) 
        if (elm) { 
         return elm.value; 
        } 
        return null; 
       }) 

       PageMethods.updateData.apply(this, values); 

、そして渡されることを私は「未定義」または「ヌル」値を持つように、これらの変数のいくつかのために可能性がどのように次のよう

私のjavascriptのコールの1の例があります私のPageMethodsコールバック私のバックエンドを介して?あなたが存在しない要素を取得しようとしている

[WebMethod] 
    public static string updateData(string[] values) 
    { 
     try 
     { 
      SqlCommand command; 
      SqlConnection sqlConn = new SqlConnection(ConfigurationManager.ConnectionStrings["DatabaseConnectionString"].ConnectionString); 
      command = new SqlCommand("updateNetEvent", sqlConn); 

      if (values[1] == "Planned Outage") 
      { 
       // NetEvent Parameters 
       command.Parameters.AddWithValue("@Name", values[0]); 
       command.Parameters.AddWithValue("@Type", values[1]); 
       command.Parameters.AddWithValue("@SubjectLine", values[9]); 
       command.Parameters.AddWithValue("@StartTime", values[14]); 
       command.Parameters.AddWithValue("@EndTime", values[15]); 

       // UserAction Parameters 
       command.Parameters.AddWithValue("@Summary", values[10]); 
       command.Parameters.AddWithValue("@ResourcesAffected", values[11]); 
       command.Parameters.AddWithValue("@ChangeBenefits", values[12]); 
       command.Parameters.AddWithValue("@PeopleAffected", System.Data.SqlTypes.SqlString.Null); 
       command.Parameters.AddWithValue("@ImpactOnEndUsers", values[13]); 
       command.Parameters.AddWithValue("@WorkAround", System.Data.SqlTypes.SqlString.Null); 
       command.Parameters.AddWithValue("@Status", "A"); 
       command.Parameters.AddWithValue("@PerformedBy", "placeholder"); // TODO: Update 
       command.Parameters.AddWithValue("@PerformedOn", DateTime.Now.ToString()); 
      } 
      else if (values[1] == "Service Disruption") 
      { 
       // NetEvent Parameters 
       command.Parameters.AddWithValue("@Name", values[0]); 
       command.Parameters.AddWithValue("@Type", values[1]); 
       command.Parameters.AddWithValue("@SubjectLine", values[2]); 
       command.Parameters.AddWithValue("@StartTime", values[7]); 
       command.Parameters.AddWithValue("@EndTime", values[8]); 

       // UserAction Parameters 
       command.Parameters.AddWithValue("@Summary", values[3]); 
       command.Parameters.AddWithValue("@ResourcesAffected", values[4]); 
       command.Parameters.AddWithValue("@ChangeBenefits", System.Data.SqlTypes.SqlString.Null); 
       command.Parameters.AddWithValue("@PeopleAffected", values[5]); 
       command.Parameters.AddWithValue("@ImpactOnEndUsers", System.Data.SqlTypes.SqlString.Null); 
       command.Parameters.AddWithValue("@WorkAround", values[6]); 
       command.Parameters.AddWithValue("@Status", "A"); 
       command.Parameters.AddWithValue("@PerformedBy", "placeholder"); // TODO: Update 
       command.Parameters.AddWithValue("@PerformedOn", DateTime.Now.ToString()); 
      } 

      command.CommandType = System.Data.CommandType.StoredProcedure; 
      sqlConn.Open(); 
      command.ExecuteNonQuery(); 
      sqlConn.Close(); 
      return "./StartPage.aspx"; 
     } 
     catch (Exception ex) 
     { 
      Console.WriteLine("ERROR: " + ex.ToString());  // Add a log helper to display errors here 
      return "Error in updateData WebMethod"; 
     } 

    } 
+0

は、彼らが価値を持っているので、N/Aまたは何かにセットを満たしませんが、彼らは未定義として扱われていないフィールドを作ります。フィールドにデフォルト値が設定されている可能性があります。 – schylake

+0

エラーは何ですか? 'ヌルのプロパティ 'value'を読み取れませんか? – Sphinxxx

答えて

3

あなたがスローさ、なぜ、これは次のとおりです。

また、ここに参照のためのバックエンドでの私のWebMethod属性があります。 .valueに電話する前に、これを確認する必要があります。

var name = null 
var nameElement = document.getElementById('<%=eventFormName.ClientID%>'); 
if (nameElement) { 
    name = nameElement.value 
} 

EDIT:

あなたのコードつもり汚いことしていることを私にビットを悩ませていますので。物事をもう少しダイナミックにするためには、以下のようなことができます。あなたがページ上にない要素の値を取得しようとしているから、あなたのPageMethods.updateDataPageMethods.updateData.apply(this, values)

const fields = { 
 
    name: 'name', 
 
    type: 'type', 
 
    subjectLineSD: '<%=eventFormSubjectLineSD.ClientID%>', 
 
    summarySD: '', 
 
    resourcesAffectedSD: '', 
 
    peopleAffectedSD: '', 
 
    workAroundSD: '', 
 
    startTimeSD: '', 
 
    endTimeSD: '', 
 
    subjectLinePO: '', 
 
    summaryPO: '', 
 
    resourcesAffectedPO: '', 
 
    changeBenefitsPO: '', 
 
    impactOnEndUsersPO: '', 
 
    starTimePO: '', 
 
    endTimePO: '', 
 
    endTimePO: '' 
 
} 
 

 
const updateData = function(name, type) { 
 
    console.log(name) 
 
    console.log(type) 
 
} 
 

 
const values = Object.keys(fields).map((key) => { 
 
    const elm = document.getElementById(fields[key]) 
 
    if (elm) { 
 
    return elm.value 
 
    } 
 
    return null 
 
}) 
 

 
updateData.apply(this, values)
<input id="name" value="NAME"> 
 
<input id="type" value="TYPE">

+0

ありがとうたくさんの男これは非常に便利です! – FrankTheTank

+0

const updateData関数の目的は何ですか?デバッグ目的のためだけですか?また、バックエンドのwebmethodコールでも、各パラメータを文字列として書き出す必要がありますか? – FrankTheTank

+0

"PageMethodsはupdateClickedで定義されていません"というエラーが表示されています – FrankTheTank

0

あなたのエラー結果を呼び出す方法をあなたのASPタグとアップデートでの各プロパティの値を置き換えます。

var name = document.getElementById('foo')を呼び出しても、id='foo'の要素がない場合、変数 'name'はnullです。したがって、エラーCannot read property 'value' of null

要素が存在することを最初に確認する変数を設定する場合、これは問題を解決するはずです。

var name = document.getElementById('foo') ? document.getElementById('foo').value : null;

+0

これはクリーナーですが、最小限であるにもかかわらず追加の 'getElementById'を行う必要があります。 – dzm