我正在创建一个显示简单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?
空不等于null。这听起来像你的存储过程需要一个值(即使它是一个空字符串)。这是业务需求还是存储过程如何编码? – JuanR
如果你想要将空值绑定为null,你需要为它创建一个ModelBinder。在将模型保存到数据库之前,尝试检查ModelState.IsValid是否反映真实之前。 – Zinov