2016-12-15 48 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