2016-12-15 85 views
0

我正在創建一個顯示簡單3字段窗體的視圖。通過我的數據庫層從控制器中檢索的值爲null,因此表單域顯示爲空,這與預期相同。模型屬性在回發中爲null

我遇到的問題是,如果我將3個表單字段留空並單擊保存,當涉及到調用存儲過程來更新行(這3個字段在數據庫中爲空)時,我得到一個異常存儲過程不喜歡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); 

你是說我應該檢查它們是否爲空嗎?如果是這樣,添加DBNull.Value?

+0

空不等於null。這聽起來像你的存儲過程需要一個值(即使它是一個空字符串)。這是業務需求還是存儲過程如何編碼? – JuanR

+0

如果你想要將空值綁定爲null,你需要爲它創建一個ModelBinder。在將模型保存到數據庫之前,嘗試檢查ModelState.IsValid是否反映真實之前。 – Zinov

回答

0

模型聯編程序將空字符串標準化爲空以便您的問題不存在。如果你調試你的代碼,你很可能會看到這些字段確實設置爲空。

你需要做的是在將字符串作爲參數添加之前檢查字符串,並改用DBNull.Value。類似這樣的:

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

在sql參數中缺少@,但是這是我以爲你的意思。 – andrewb