Patrick
Patrick

Reputation: 2781

Model not Binding to Action passing Null as value

I don't know why, the Model is not binding to the Create Action:

ViewModel:

public class AddressContactViewModel
{
    // Primary properties
    public int Id { get; set; }
    public string Contact { get; set; }

    // Navigation properties

    [Display(ResourceType = typeof(HeelpResources), Name = "AddressContactViewModelNameLabel")]
    [Required(ErrorMessageResourceName = "ErrorMsgRequiredField", ErrorMessageResourceType = typeof(HeelpResources))]
    public int ContactType_Id { get; set; }

    public int Address_Id { get; set; }

    // ViewModel dropdownlists
    public IEnumerable<SelectListItem> ContactTypeList { get; set; }
}

View:

@model Heelp.ViewModels.AddressContactViewModel

@using (Html.BeginForm()) {

    @Html.AntiForgeryToken()

    @Html.HiddenFor(m => m.Address_Id)

    <fieldset>
        <legend>AddressContactViewModel</legend>

       <div id="year">
        @Html.DisplayNameFor(m => m.ContactType_Id)
        @Html.DropDownListFor(m => m.ContactType_Id, Model.ContactTypeList, HeelpResources.AddressContactViewModelContactTypesListDropDownFirstRecord)
        @Html.ValidationMessageFor(m => m.ContactType_Id)
    </div>
    <div class="editor-label">
        @Html.LabelFor(m => m.Contact)
    </div>
    <div class="editor-field">
        @Html.TextBoxFor(m => m.Contact)
        @Html.ValidationMessageFor(m => m.Contact)
    </div>

    <p>
        <input type="submit" value="Create" />
    </p>
</fieldset>
}

Action Post:

    [HttpPost]
    [ValidateAntiForgeryToken]
    public virtual ActionResult ContactCreate(AddressContactViewModel contact)
    {
        var contactDto = Mapper.Map<AddressContactViewModel, AddressContactDto>(contact);

        _addressContactService.Create(contactDto);

        return RedirectToAction(MVC.Address.ContactList());
    }

EDIT: Get:

    public virtual ActionResult ContactCreate(int addressId)
    {
        var model = new AddressContactViewModel
            {
                Address_Id = addressId,
                ContactTypeList = ContactTypeDropDownList()
            };

        return View(model);
    }

When I submit the Form, I receive "null" in the contact parameter of the ContactCreate action, why is this happening?

Thanks

Upvotes: 2

Views: 1289

Answers (2)

Patrick
Patrick

Reputation: 2781

Unbelievable, I found the problem, the parameter of the action has the same name of a field in the ViewModel, a change of the parameter name and everything works find:

    [HttpPost]
    [ValidateAntiForgeryToken]
    public virtual ActionResult ContactCreate(AddressContactViewModel addressContact) // HERE I CHANGE FROM contact TO addressContact AND THE PROBLEM GET SOLVED
    {
        var contactDto = Mapper.Map<AddressContactViewModel, AddressContactDto>(addressContact);

        _addressContactService.Create(contactDto);

        return RedirectToAction(MVC.Address.ContactList(addressContact.Address_Id));
    }

Upvotes: 3

Robert
Robert

Reputation: 4406

I ran into this same problem on my last app. try encompassing the button and the field you want to submit into the same div:

@model Heelp.ViewModels.AddressContactViewModel

@using (Html.BeginForm()) {

@Html.AntiForgeryToken()

@Html.HiddenFor(m => m.Address_Id)

<fieldset>
    <legend>AddressContactViewModel</legend>

   <div id="year">
    @Html.DisplayNameFor(m => m.ContactType_Id)
    @Html.DropDownListFor(m => m.ContactType_Id, Model.ContactTypeList, HeelpResources.AddressContactViewModelContactTypesListDropDownFirstRecord)
    @Html.ValidationMessageFor(m => m.ContactType_Id)
</div>
<div class="editor-label">
    @Html.LabelFor(m => m.Contact)
</div>
<div class="editor-field">
    @Html.TextBoxFor(m => m.Contact)
    @Html.ValidationMessageFor(m => m.Contact)
    <input type="submit" value="Create" />
</div>
</fieldset>
}

Upvotes: 0

Related Questions