Простое обновление формы без сохранения БД - PullRequest
0 голосов
/ 27 декабря 2011

У меня есть простое фиктивное приложение ASP.NET MVC 3 (просто изучаю MVC из WebForms).

И я довольно озадачен тем, как обновить форму без каких-либо промежуточных вещей в БД. У меня просто есть форма с текстовым полем, и после нажатия кнопки я хочу видеть строку в верхнем регистре. Но у меня ничего не происходит.

Контроллер:

    public ActionResult Index()
    {
        ToUppercaseModel model = new ToUppercaseModel { TheString = "testing" };

        return View(model);
    }

    [HttpPost]
    public ActionResult Index(ToUppercaseModel model)
    {
        model.TheString = model.TheString.ToUpper();

        return View(model);
    }

Модель:

public class ToUppercaseModel
{
    [Display(Name = "My String")]
    public string TheString { get; set; }
}

А вид:

@using (Html.BeginForm()) {
    <div>
        <div class="editor-label">
            @Html.LabelFor(m => m.TheString)
        </div>
        <div class="editor-field">
            @Html.TextBoxFor(m => m.TheString)
        </div>
        <p>
            <input type="submit" value="Convert" />
        </p>
    </div>
}

Я думаю, это просто. Теперь очевидно, что return View(model); во втором методе Index не работает. Я видел кое-что о RedirectToAction() и сохранении данных в TempData. В большинстве примеров просто укажите некоторый идентификатор, но, поскольку у меня нет базы данных, которая не работает.

Если я сделаю это:

return RedirectToAction("Index", model);

Я получаю

Для этого объекта не определен конструктор без параметров.

Сообщение об ошибке. Это должно быть просто, нет? Я думаю, что понимаю концепцию Post / Redirect / Get , но не понимаю, как применить ее для чего-то простого.

Спасибо за разъяснения.

Ответы [ 3 ]

1 голос
/ 28 декабря 2011

Когда MVC отображает представление, оно будет использовать значение попытки поля, а не значение модели, если оно существует (например, в поле даты, которое я поставил «вторник», это не будет привязывать модель, но вы захотите показать используйте поле для ввода и выделите его как недействительное), вы изменяете значение модели, но не значение попытки.

Попытка удерживается в словаре состояния модели:

ModelState["KeyToMyValue"].Value.Value.AttemptedValue

Доступ к этим значениям и их изменение могут быть сложными, если только вы не хотите загружать магические строки в своем коде, и поскольку при привязке модели происходит проверка, ваше измененное значение не будет проверено.

В этих условиях я рекомендую позвонить ModelState.Clear(), это удалит все проверенные и предпринятые значения, а затем изменит вашу модель напрямую. Наконец, вы хотите получить подтверждение модели, используя TryValidateModel(yourModel).

Имейте в виду, что этот метод, вероятно, является самым простым нехакерским способом сделать это, но удалит попытки значения, которые не могут быть привязаны из возвращенного представления.

1 голос
/ 27 декабря 2011

Вы должны вызвать 1 метод из метода 2, но вы должны изменить его

public ActionResult Index (модель ToUppercaseModel)

и отправить в 1 метод вашу модель.

public ActionResult Index(ToUppercaseModel? model)
    {
        if (model == null)    
        ToUppercaseModel model = new ToUppercaseModel { TheString = "testing" };
        return View(model);
    }
0 голосов
/ 28 декабря 2011

Я думаю, что у меня есть решение, оно работает, но не уверен, так ли это должно быть?
По сути, я просто помещаю свою модель в TempData и снова вызываю обычный метод Index.

    public ActionResult Index()
    {
        ToUppercaseModel model = null;

        if (TempData["FeaturedProduct"] == null)
        {
            model = new ToUppercaseModel { TheString = "testing" };
        }
        else
        {
            model = (ToUppercaseModel)TempData["FeaturedProduct"];
        }
        return View(model);
    }


    [HttpPost]
    public ActionResult Index(ToUppercaseModel model)
    {
        model.TheString = model.TheString.ToUpper();

        TempData["FeaturedProduct"] = model;

        //return View(model);
        return RedirectToAction("Index");
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...