我正在创建一个显示简单3字段表单的视图。通过我的数据库层从控制器检索的值为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 :(得分:0)
模型绑定器将空字符串规范化为null,因此您的问题不存在。如果您调试代码,您很可能会看到字段确实设置为null。
您需要做的是在将字符串添加为参数之前检查字符串,然后使用DBNull.Value。像这样:
var param = !string.IsNullOrEmpty(campaignName) ?
new SqlParameter("campaignName", campaignName) :
new SqlParameter { ParameterName = "campaignName", SqlDbType = SqlDbType.NVarChar, Value = DBNull.Value };
答案 1 :(得分:0)
当我使用“ Generate property ...”创建它们时,我具有空模型属性。
代码生成器将'set'方法设置为'内部'集合:
public string MyProperty { get; internal set; }
删除“内部”可使其通过回发设置:
public string MyProperty { get; set; }