2016-12-15 6 views
0

単純な3フィールドフォームを表示するビューを作成しています。私のデータベース層を介してコントローラから取得された値はnullなので、フォームフィールドは空白として表示されます。これは期待どおりです。ポストバック時にモデルプロパティがnullになる

3つのフォームフィールドを空白にして[保存]をクリックすると、ストアドプロシージャを呼び出して行を更新するときに(これら3つのフィールドがデータベースでNULL可能です)、次のような例外が発生します。ストアドプロシージャはnullを好きではありません。ここで

私のモデルである:

public class UserModel 
{ 
    [DisplayName("Campaign Name")] 
    public string CampaignName { get; set; } 
    [DisplayName("User Owner Name")] 
    public string UserOwnerName { get; set; } 
    [DisplayName("Lead Status")] 
    public string LeadStatus { get; set; } 
} 

コントローラー:

[HttpPost] 
public ActionResult OptionalFields(Models.UserModel model) 
{ 
    var businessLayerFunctions = new BL.Functions(); 
    businessLayerFunctions.UpdateConfig(model); 
    return View(); 
} 

ビュー:私はそれらを提出する際に、これらのフィールドが空の場合は

@using (Html.BeginForm("OptionalFields", "Home")) 
{ 
    @Html.HiddenFor(m => m.ConfigID) 
    @Html.LabelFor(m => m.CampaignName) 
    @Html.TextBoxFor(m => m.CampaignName) 
    @Html.LabelFor(m => m.LeadStatus) 
    @Html.TextBoxFor(m => m.LeadStatus) 
    @Html.LabelFor(m => m.UserOwnerName) 
    @Html.TextBoxFor(m => m.UserOwnerName) 
    <p><input type="submit" id="optionalfields" value="Save" /></p> 
} 

私の質問は、である、彼らはでしょう""とモデルにバインドされていませんか?

のRequest.Form制御方法は

{たConfigID = 123 & CAMPAIGNNAME = & LeadStatus = & UserOwnerName =}

設計によってヌルであるフィールドかである内部それが立っているので、nullをチェックして、ストアドプロシージャを動作させるために空の文字列を代入する必要があります。

私のストアドプロシージャは、ただ一つのライナー

UPDATE dbo.table 
    SET UserOwnerName = @userOwnerName, 
     LeadStatus = @leadStatus, 
     CampaignName = @campaignName, 
     LastModifiedDate = @lastModifiedDate 
    WHERE ConfigID = @configID 

であると私はそう

comm.Parameters.AddWithValue("@configID", configID); 
comm.Parameters.AddWithValue("@userOwnerName", userOwnerName); 
comm.Parameters.AddWithValue("@leadStatus", leadStatus); 
comm.Parameters.AddWithValue("@campaignName", campaignName); 
comm.Parameters.AddWithValue("@lastModifiedDate", DateTime.UtcNow); 

のように、これらのパラメータを追加し、あなたは彼らがここにnullの場合、私がチェックすべきと言っていますか?そしてもしそうなら、DBNull.Valueを追加しますか?

+0

空はnullと同じではありません。ストアドプロシージャに値が必要なように聞こえます(空の文字列であっても)。これはビジネス要件か、ストアドプロシージャのコーディング方法ですか? – JuanR

+0

空の値をnullとしてバインドする場合は、そのためにModelBinderを作成する必要があります。モデルにデータベースを保存する前に、ModelState.IsValidにtrueが反映されているかどうかを確認する前に確認してください。 – Zinov

答えて

0

モデルバインダーは、空の文字列をnullに正規化して、問題が存在しないようにします。コードをデバッグすると、フィールドが実際にnullに設定されている可能性が高くなります。

あなたがする必要があるのは、パラメータとして追加する前に文字列をチェックし、代わりにDBNull.Valueを使用することです。このようなもの:

var param = !string.IsNullOrEmpty(campaignName) ? 
      new SqlParameter("campaignName", campaignName) : 
      new SqlParameter { ParameterName = "campaignName", SqlDbType = SqlDbType.NVarChar, Value = DBNull.Value }; 
+0

sqlパラメータに@がありませんが、これは私があなたが意味すると思ったものです。 – andrewb

関連する問題