Question

I'm with a problem when updating an object in my MVC application:

This is my whole view, it has a submit button that must to update itens inside NotAcceptedJobOfferts list:

@model  TCCApplication.ViewModels.ProfessionalDashboard

@{
    ViewBag.Title = "Dashboard";
}
@using (Html.BeginForm("AcceptJobOfferts","Professional")){
<div class="row">
    <div class="col-md-5">

        @Html.HiddenFor(model => model.Professional.Id)

        <h2>Minhas tarefas</h2>

        @for (int i = 0; i < Model.AcceptedJobOfferts.Count; i++)
        {

            @Html.HiddenFor(itemModel => Model.AcceptedJobOfferts[i].Id)

            <div class="row">
                <div class="col-md-3">
                    <label>Oferta: </label>
                    @Html.DisplayFor(itemModel => Model.AcceptedJobOfferts[i].Description)
                </div>

                @*<div class="col-md-2">
                    <label>Aceito</label>
                    @Html.DisplayFor(itemModel => Model.AcceptedJobOfferts[i].Accepted)
                </div>*@

                <div class="col-md-5">
                    <label>Data do trabalho</label>
                    @Html.DisplayFor(itemModel => Model.AcceptedJobOfferts[i].JobDate)
                </div>


                @Html.HiddenFor(itemModel => Model.AcceptedJobOfferts[i].Professional.Id)
                @Html.HiddenFor(itemModel => Model.AcceptedJobOfferts[i].Professional.Name)
                @Html.HiddenFor(itemModel => Model.AcceptedJobOfferts[i].Professional.Skills)
                @Html.HiddenFor(itemModel => Model.AcceptedJobOfferts[i].Professional.BirthDate)

                @Html.HiddenFor(itemModel => Model.AcceptedJobOfferts[i].JobDate)
                @Html.HiddenFor(itemModel => Model.AcceptedJobOfferts[i].Active)
                @Html.HiddenFor(itemModel => Model.AcceptedJobOfferts[i].Description)
                @Html.HiddenFor(itemModel => Model.AcceptedJobOfferts[i].Accepted)

            </div>
        }
    </div>
    <div class="col-md-7">

        <h2>Ofertas de trabalho indicadas</h2>

            @for (int i = 0; i < Model.NotAcceptedJobOfferts.Count; i++)
            {

                @Html.HiddenFor(itemModel => Model.NotAcceptedJobOfferts[i].Id)
                @Html.HiddenFor(itemModel => Model.NotAcceptedJobOfferts[i].Description)
                @Html.HiddenFor(itemModel => Model.NotAcceptedJobOfferts[i].Active)
                @Html.HiddenFor(itemModel => Model.NotAcceptedJobOfferts[i].Accepted)
                @Html.HiddenFor(itemModel => Model.NotAcceptedJobOfferts[i].JobDate)

                @Html.HiddenFor(itemModel => Model.NotAcceptedJobOfferts[i].Professional.Id)


                <div class="row">
                    <div class="col-md-3">
                        <label>Oferta: </label>
                        @Html.EditorFor(itemModel => Model.NotAcceptedJobOfferts[i].Description)
                    </div>

                    <div class="col-md-2">
                        <label>Aceito</label>
                        @Html.EditorFor(itemModel => Model.NotAcceptedJobOfferts[i].Accepted)
                    </div>

                    <div class="col-md-5">
                        <label>Data do trabalho</label>
                        @Html.DisplayFor(itemModel => Model.NotAcceptedJobOfferts[i].JobDate)
                    </div>  

                </div>
            }
            <div>
                <input type="submit" value="Aceitar Ofertas" />
            </div>


    </div>

</div>


<div class="row" style="height:50px">




</div>



<div class="row">

    <div class="col-md-12 text-center">
        <div>
            <label>Cliente: </label>

            @Model.Professional.Name
        </div>

        <div>
            <label>Data de nascimento: </label>

            @Model.Professional.BirthDate
        </div>

        <div>
            <label>Telefone: </label>

            @Model.Professional.PhoneNumber
        </div>

        <div>
            <label>Usuário: </label>

            @Model.Professional.UserAccount.Username
        </div>

        <div>
            <label>Profissão: </label>

            @Model.Professional.Profession
        </div>

        <div>
            <label>Bairro: </label>

            @Model.Professional.UserAddress.Neighborhood
        </div>

        <p class="div-to-btn">
            @Html.ActionLink("Alterar informações", "Edit", new { id = @Model.Professional.Id })
        </p>

    </div>
</div>
}

But when I sent the data to controller the object is not updated:

My controller methods:

        public ActionResult ViewMyTasks(int professionalId)
        {
            initBusinessObjects();

            ProfessionalDashboard dashboard = new ProfessionalDashboard();

            var notAcceptedJobOfferts = jobOffertBusiness.GetNotAcceptedJobOfferts(professionalId).ToList();

            var acceptedJobOfferts = jobOffertBusiness.GetAcceptedJobOfferts(professionalId).ToList();
            var professional = professionalBusiness.GetById(professionalId);

            dashboard.AcceptedJobOfferts = acceptedJobOfferts;
            dashboard.NotAcceptedJobOfferts = notAcceptedJobOfferts;
            dashboard.Professional = professional;

            return View(dashboard);
        }

        [HttpPost]
        public ActionResult AcceptJobOfferts(ProfessionalDashboard profDash)
        {
            initBusinessObjects();

            foreach (var jo in profDash.NotAcceptedJobOfferts)
            {
                jobOffertBusiness.Update(jo);
            }

            return RedirectToAction("ViewMyTasks", new { professionalId = profDash.Professional.Id});
        }

What I must to do to my view send updated data?

Was it helpful?

Solution

Hidden fields has same name with the inputs which is causes duplicate form keys. You need to remove hiddens or change their name.

@Html.HiddenFor(itemModel => Model.NotAcceptedJobOfferts[i].Description) 
// eg. <input type="hidden" name="NotAcceptedJobOfferts[0].Description" />
...
@Html.EditorFor(itemModel => Model.NotAcceptedJobOfferts[i].Description)
// eg. <input type="text" name="NotAcceptedJobOfferts[0].Description" />

OTHER TIPS

try this

@using(Html.BeginForm("Action","Controller",FormMethod.Post))
{
   ...
   ...
}
Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top