Ненавязчивый Ajax MVC3 - Частичное представление, не отражающее модель - PullRequest
1 голос
/ 15 декабря 2011

Кажется, что все работает должным образом, за исключением того, что после возврата объекта Partial с моделью, имеющей NAME = "foo" после вставки объекта, он не меняет текстовые поля Name и PercentAlcohol со значениями в модели.

Когда я выводю @Model.Name в заголовке партиала по сообщениям проверки, он правильно показывает "foo".Но форма все равно сообщает, что было в текстовых полях, когда она была отправлена.

HTML

<div id="createBeerForm">
    @{Html.RenderPartial("CreatePartial", new BeerCreateModel());}
</div>

CreatePartial

@{
    AjaxOptions options = new AjaxOptions
    {
        HttpMethod = "Post",
        UpdateTargetId = "createBeerForm", 
        InsertionMode = InsertionMode.Replace
    };        
}

@using (Ajax.BeginForm("Create", "Beer", null, options, new { @class = "form-stacked" }))
{
    @Html.ValidationSummary(true, "You have errors. Fix them.")
    @Html.LabelFor(m => m.Name)
    <div>
        @Html.TextBoxFor(m => m.Name, new { @class = "xlarge" })  
        @Html.ValidationMessageFor(m => m.Name)
    </div>
    @Html.LabelFor(m => m.PercentAlcohol)
    <div>
        @Html.TextBoxFor(m => m.PercentAlcohol, new { @class = "xlarge" }) 
        @Html.ValidationMessageFor(m => m.PercentAlcohol)
    </div>
    <p>
        <input type="submit" value="Create Beer" />
    </p>
}

Контроллер

    [HttpPost]
    public ActionResult Create(BeerCreateModel model)
    {
        if (ModelState.IsValid)
        {
            //Add Beer to DB
            return PartialView("CreatePartial", new BeerCreateModel { Name = "foo"});
        }
        else
        {
            return PartialView("CreatePartial", model);
        }
    }

1 Ответ

3 голосов
/ 15 декабря 2011

Вы должны очистить состояние модели, если хотите изменить значения в действии контроллера POST. Помощники HTML сначала смотрят на состояние модели при связывании, а затем на модель. Итак:

[HttpPost]
public ActionResult Create(BeerCreateModel model)
{
    if (ModelState.IsValid)
    {
        //Add Beer to DB

        // Here you are modifying the value of the Name parameter
        // in your model. But this parameter is also in ModelState.
        // So if you want this change to reflect on the subsequent view you
        // need to either clear it from the modelstate
        ModelState.Remove("Name");
        return PartialView("CreatePartial", new BeerCreateModel { Name = "foo"});
    }
    else
    {
        return PartialView("CreatePartial", model);
    }
}
...