Controller从视图中动态添加的对象获取null

时间:2012-07-24 19:45:54

标签: asp.net-mvc razor

我添加了一个动态添加的对象,如:

@Html.EditorFor(model => model.Province)

我的模型包含省属性,但视图在开头没有显示对象。我通过.show()方法将其显示出来。

但是,在控制器中,我发现省的值总是为null。如何通过这样的动态添加对象访问它?

添加了: 我的模型看起来像这样:

public class Location
{
    [Required]
    public int ID { get; set; }
    [Required]
    public string Name { get; set; }
    public string Description { get; set; }
    public string Street { get; set; }
    public string City { get; set; }
    [Display(Name = "State/Province")]
    public string Province { get; set; }
}

控制器:

    [HttpPost]
    public ActionResult Create(Location location)
    {
        if (ModelState.IsValid)
        {
            db.Location.Add(location);
            db.SaveChanges();
            return RedirectToAction("Index");
        }
    }

视图:

    <div class="editor-label">
        @Html.LabelFor(model => model.Province)
    </div>
    <div class="editor-field">
    <div id="province_ddl">
        @Html.DropDownListFor(
            x => x.Province,
            Enumerable.Empty<SelectListItem>(),
            "-- Select State/Province --"
            )
    </div>
    <div id="province_tb" style="display: none">
        @Html.EditorFor(model => model.Province)
    </div>
        @Html.ValidationMessageFor(model => model.Province)
    </div>

当我使用下拉列表时,它将具有适用于省属性的值。但是,如果我使文本框控件可见,它将没有值,即在控制器中获得空值。

1 个答案:

答案 0 :(得分:1)

您不能在同一表单中使用相同名称的两个输入字段(在您的情况下为Province)。嗯,实际上你可以,但只有第一个的值将被发送到控制器。因此,如果您保留下拉列表,它将是将始终发送到控制器的下拉列表的选定值。所以基本上你必须做出决定。您可以禁用其中一个字段(通过向其添加disabled="disabled"属性,可以动态完成)以仅强制发送另一个字段的值。