发布表单时查看不绑定的模型

时间:2013-04-20 21:54:32

标签: c# asp.net-mvc-4 model-binding

当我提交表单时,值未绑定到视图模型。我看不出我做错了什么。有没有人在我的代码中看到我遗漏的东西。

以下是视图的一部分:

@model FacilitiesCostIndex.ViewModels.AddAsset.TheViewModel

<div id="addAssetForm-div">
@using (Html.BeginForm("Submit", "AddAsset", FormMethod.Post, new { id = "AddAssetForm" }))
{
<span class="formTitle">@ViewBag.Title</span><br />

<fieldset id="topRow">
    <legend></legend>
    <!--Location-->
    <span id="location" class="notes">- Location -</span><br />
    <!--Site-->
    <span id="site-span">
        @Html.LabelFor(model => model.SiteId, new { @class = "formLabel" })
        @Html.DropDownListFor(model => model.SiteId, Model.SiteItems, new { id = "siteDrpDwn", @class = "formDropDown" })
        @Html.ValidationMessageFor(model => model.SiteId, string.Empty, new { id = "siteVldMsg", @class = "formValidationMessage" })
    </span>
    <!--Floor-->
    <span id="floor-span">
        @Html.LabelFor(model => model.FloorId, new { @class = "formLabel" })
        <span id="floorDrpDwnContainer" data-populateurl="@Url.Action("PopulateFloorDrpDwn", "AddAsset")" data-unpopulateurl="@Url.Action("UnpopulateFloorDrpDwn", "AddAsset")">
            @{Html.RenderPartial("AddAsset/UnpopulatedFloorDrpDwn", new FacilitiesCostIndex.ViewModels.AddAsset.FloorDrpDwnViewModel());}
        </span>
        @Html.ValidationMessageFor(model => model.FloorId, string.Empty, new { id = "floorVldMsg", @class = "formValidationMessage" })
    </span>
    <!--Zone-->
    <span id="zone-span">
        @Html.LabelFor(model => model.ZoneId, new { @class = "formLabel" })
        <span id="zoneDrpDwnContainer" data-populateurl="@Url.Action("PopulateZoneDrpDwn", "AddAsset")" data-unpopulateurl="@Url.Action("UnpopulateZoneDrpDwn", "AddAsset")">
            @{Html.RenderPartial("AddAsset/UnpopulatedZoneDrpDwn", new FacilitiesCostIndex.ViewModels.AddAsset.ZoneDrpDwnViewModel());}
        </span>
        @Html.ValidationMessageFor(model => model.ZoneId, string.Empty, new { id = "zoneVldMsg", @class = "formValidationMessage" })
    </span><br />
</fieldset>

<fieldset id="leftColumn">
    <legend></legend>
    <!--Install Date-->
    <div id="installDate-div" class="leftColumnItem">
        @Html.LabelFor(model => model.InstallDate, new { id="installDateLbl" }) <br />
        @Html.TextBoxFor(model => model.InstallDate, new { id="installDateTxt" })
    </div>

    <!--Name-->
    <div id="assetName-div" class="leftColumnItem">
        @Html.LabelFor(model => model.AssetName, new { @class="formLabel" }) <br />
        @Html.TextBoxFor(model => model.AssetName, new { id="assetNameTxt", @class = "formTextbox" })
    </div>
    <!--Asset Number-->
    <div id="assetNumber-div" class="leftColumnItem">
        @Html.LabelFor(model => model.AssetNumber, new { @class="formLabel" }) <br />
        @Html.TextBoxFor(model => model.AssetNumber, new { id="assetNumberTxt", @class = "formTextbox" })
    </div>
    <!--Description-->
    <div id="description-div" class="leftColumnItem">
        @Html.LabelFor(model => model.Description, new { @class="formLabel" }) <br />
        @Html.TextBoxFor(model => model.Description, new { id="descriptionTxt", @class = "formTextbox" })
    </div>
    <!--Group-->
    <div id="group-div" class="leftColumnItem">
        @Html.LabelFor(model => model.GroupId, new { @class = "formLabel" }) <br />
        @Html.DropDownListFor(model => model.GroupId, Model.GroupItems, new { id = "groupDrpDwn", @class = "formDropDown" })
        @Html.ValidationMessageFor(model => model.GroupId, string.Empty, new { id = "groupVldMsg", @class = "formValidationMessage" })
    </div>

以下是ViewModel的一部分:

public class TheViewModel
{
    [Display(Name = "Site")]
    public int SiteId { get; set; }
    public IEnumerable<SelectListItem> SiteItems { get; private set; }

    [Display(Name = "Floor")]
    [Required(ErrorMessage = "Please select a Floor.")]
    public int FloorId { get; set; }

    [Display(Name = "Zone")]
    [Required(ErrorMessage = "Please select a Zone.")]
    public int ZoneId { get; set; }

    [Display(Name = "Name")]
    [Required(ErrorMessage = "Please enter an Asset Name.")]
    public string AssetName { get; set; }

    [Display(Name = "Asset Number")]
    [Required(ErrorMessage = "Please enter an Asset Number.")]
    public string AssetNumber { get; set; }

    [Display(Name = "Description")]
    public string Description { get; set; }

    [Display(Name = "INSTALL DATE")]
    [Required(ErrorMessage = "Please enter an install date.")]
    public DateTime? InstallDate { get; set; }

    [Display(Name = "Group")]
    [Required(ErrorMessage = "Please select a Group.")]
    public int GroupId { get; set; }
    public IEnumerable<SelectListItem> GroupItems { get; private set; }

    public TheViewModel()
    {
        SiteId = -1;
        SetSiteItems();
        GroupId = -1;
        SetGroupItems();
    }

这是控制器的代码:

    [HttpPost]
    public ActionResult Submit(TheViewModel model)
    {
        DateTime DateEntered = DateTime.Now;

        AssetModel AnAsset = new AssetModel();
        AnAsset.AssetName = model.AssetName;
        AnAsset.AssetNumber = model.AssetNumber;
        AnAsset.AssetTypeId = model.AssetTypeId;
        AnAsset.GroupId = model.GroupId;
        AnAsset.ZoneId = model.ZoneId;
        AnAsset.Description = model.Description;

        //Note: Conversion from nullable to non-nullable type is dealt with.
        if (model.InstallDate.HasValue)
        {
            AnAsset.InstallDate = model.InstallDate.Value;
        }

        //Send asset to insert method.
        new AssetRepositoryModel().Insert(AnAsset);

        return View();
    }

感谢您能给我的任何帮助。感谢。

1 个答案:

答案 0 :(得分:0)

可能解决了在Global.asax中使用绑定并定义从IModelBinder继承的TheViewModelBinder类?

ModelBinders.Binders.Add( typeof(TheViewModel), new TheViewModelBinder() );

和binder类是这样的:

public class TheViewModelBinder : IModelBinder {
    public object BindModel( ControllerContext controllerContext, ModelBindingContext     bindingContext ) {
                    var theViewModel = new TheViewModel();
                    theViewModel.SiteId = int.Parse(request.Form.Get( "SiteId" ));
                    //other your code here
            }
    }