Asp MVC 3.0 Проблема с входным значением формы Ajax - PullRequest
0 голосов
/ 15 июля 2011

У меня есть простая модель

public class ModelTest
{
    public string MyValue { get; set; }
}

С простым контроллером

public class ModelTestController : Controller
{
    public ActionResult Editor()
    {
        return View();
    }

    [AcceptVerbs(HttpVerbs.Post)]
    public ActionResult Editor(ModelTest modelTest)
    {
        modelTest.MyValue += " Post!";
        return View(modelTest);
    }

    public ActionResult Start()
    {
        return View(new ModelTest { MyValue = "initial value" });
    }
}

С видом на Пуск

<body>
    <h1>testing</h1>
    <div id="editorDiv">
        <% Html.RenderPartial("Editor", Model); %>      
    </div>
</body>

И редактор управления:

<%@ Control Language="C#" Inherits="System.Web.Mvc.ViewUserControl<MvcTest.Models.ModelTest>" %>

<% using (Ajax.BeginForm("Editor", new AjaxOptions { UpdateTargetId = "editorDiv", })) { %> 
    Current real Value:  <%: Model.MyValue %> <br />

    <%: Html.TextBoxFor(model => model.MyValue) %>  <br />

    <input type="submit" value="Zapisz" id="saveInput" />    
<% } %>

РЕДАКТИРОВАТЬ: (У меня было мало времени, и я написал немного понятно)

У меня есть InitialValue в текстовом поле из модели:

enter image description here

Затем я написал текст «Тест» и нажал кнопку «Записать».В моем контроллере метода публикации значение «Редактор» должно быть изменено с «Тест» на «Тест пост»!и в текстовом поле просмотра (вход) shold имеют значение «Test Post!».Вместо этого из Html.TextBoxFor (model => model.MyValue) я получаю старое значение «Test», но из <%: Model.MyValue%> получаю текущее значение.

enter image description here

Почему textBox теряет значение из модели?

1 Ответ

1 голос
/ 16 июля 2011

Вам нужно удалить старое значение из ModelState, если вы намереваетесь изменить значение POST внутри действия контроллера, которое обрабатывает отправку формы:

[AcceptVerbs(HttpVerbs.Post)]
public ActionResult Editor(ModelTest modelTest)
{
    ModelState.Remove("MyValue");
    modelTest.MyValue += " Post!";
    return View(modelTest);
}

Причина этого в том, что стандартные помощники HTML, такие как TextBoxFor, сначала ищут значения, присутствующие в ModelState (POST, GET запрашивает значения), и если они находят значение там, они будут его использовать. Только если нет значения с заданным именем (тем, которое вы используете в лямбда-выражении при создании помощника), они будут использовать значение, присутствующее в вашей модели.

Обратите внимание, что это поведение является заданным, и не имеет значения, выполняете ли вы обычный или AJAX-запрос. Поэтому либо удалите значение из состояния модели, как я показал, либо напишите свой собственный помощник, который сгенерирует текстовое поле и будет использовать значение из модели.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...