回发时模型属性为null

时间:2016-12-15 18:33:19

标签: c# asp.net

我正在创建一个显示简单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?

2 个答案:

答案 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; }