MVC2 TextBox для значения не обновляется после отправки?

Это действительно странное поведение, и я настроил демонстрационный код, чтобы попытаться выяснить, что происходит.

В основном есть два действия и одно представление. Первое действие отправляет пустую модель в представление, действие section получает модель, изменяет ее содержимое и отправляет обратно в то же представление.

Странность, с точки зрения модели, в ней, похоже, есть обновленные значения, но когда я делаю Html.TextBoxFor (x => x.PropertyNameHere), она отображает текстовое поле с неизменным значением в нем.

LOL ... Я заранее извиняюсь за туалетный юмор, но это не дает скучать. ;)

Кто-нибудь знает, что здесь происходит? Почему выходные данные TextBoxFor помещают старое значение в атрибут value?

Вот код для копирования:

/Views/Demo/Index.aspx

<%@ Page Language="C#" Inherits="System.Web.Mvc.ViewPage<TestWeb.DemoModel>" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" >
<head runat="server">
    <title>Demo</title>
</head>
<body>
    <div>
      <%using (Html.BeginForm("DemoSubmit", "Admin", FormMethod.Post)) { %>
        Foo: <%=Html.TextBoxFor(x => x.Foo)%> <%:Model.Foo %><br />
        Bar: <%=Html.TextBoxFor(x => x.Bar) %> <%:Model.Bar %><br />
        PoopSmith: <%=Html.TextBoxFor(x => x.PoopSmith) %> <%:Model.PoopSmith %><br />
        <button type="submit">Submit</button>
      <%} %>
    </div>
</body>
</html>

DemoModel.cs

namespace TestWeb {
    public class DemoModel {
        public string Foo { get; set; }
        public int Bar { get; set; }
        public string PoopSmith { get; set; }
    }
}

DemoController.cs

public class AdminController : Controller {

        public ActionResult Index() {
            var m = new DemoModel();
            return View(m);
        }

        public ActionResult DemoSubmit(DemoModel demo) {
            demo.Foo += "!!!";
            demo.Bar++;
            demo.PoopSmith += " has pooped.";
            return View("Index", demo);
        }
}

А вот странный вывод:

Bizarre http://i47.tinypic.com/308cwvb.png

12 голосов | спросил Ben Lesh 28 Mayam10 2010, 00:31:20

5 ответов


0

Html-помощник по умолчанию пытается заново отобразить данные, которые ему отправлены. Сначала они используют значение из опубликованных данных, а если нет опубликованных данных, они берут данные из модели.

Очевидно, это не то, что вам нужно, но все же наиболее распространенное использование: некоторые данные отображаются в полях формы после получения запроса на получение. Вы публикуете сообщение об обновлении. Если у вас есть ошибки, вы хотите снова отобразить форму с введенными вами значениями.

Я видел, как некоторые люди обошли это (я думаю, написав в ModelState), но я всегда выбирал не использовать помощников по умолчанию, если они не помогают мне. Это особенно актуально для скрытых полей: большинство людей смущаются, когда устанавливают значение для скрытого поля, но действительно используемое значение взято из публикации. По крайней мере, каждый день возникает вопрос об этом на SO: -)

Забудьте «Большинство людей» и замените его на «Все».

ASP.NET MVC: значение скрытого поля не отображается при использовании HtmlHelper.Hidden

http://blog.johnwest.com /post/ASPNET-MVC-Hidden-Form-Field-Bug.aspx

http://blogs.msdn.com/b/simonince/archive/2010/05/05/asp-net-mvc-s-html-helpers ? -render-The-неправильно-value.aspx utm_medium = Twitter & амп; utm_source = Shared

UPDATE О, я нашел еще один с сегодняшнего дня (Вы не одиноки):

Как обновить значение текстового поля

ответил Mathias F 28 Mayam10 2010, 02:11:58
0

Do ModelState.Clear (); в вашем контроллере, чтобы предотвратить это. Для этого проверьте MSDN .

ответил Sander 3 rdEurope/Moscowp30Europe/Moscow09bEurope/MoscowFri, 03 Sep 2010 10:24:11 +0400 2010, 10:24:11
0

Я бы избегал ModelState.Clear () или ModelState.Remove (), если в этом нет необходимости. Как правило, если вы видите это поведение, то это потому, что а) вы не следуете шаблону Post-Redirect-Get и должны быть, или б) если это не подходит, вам следует рассмотреть возможность не использовать метод TextBox в HtmlHelper, так как он в основном разработан, чтобы помочь с проверкой и т. д. при следовании шаблону PRG.

Я уверен, что есть исключения (например, пользовательский интерфейс в стиле мастера может закончиться примерно так), но я бы принял это как подход по умолчанию.

ответил Simon Ince 31 MaramThu, 31 Mar 2011 00:12:24 +04002011-03-31T00:12:24+04:0012 2011, 00:12:24
0

Решение состоит в том, чтобы использовать либо ModelState.Remove («[Имя свойства режима]»), прежде чем ему будет присвоено новое значение с помощью контроллера. Или на странице просмотра измените Html.TextBoxFor () на Html.TextBox () для конкретного свойства модели.

ответил IMBM 31 MarpmThu, 31 Mar 2011 17:33:52 +04002011-03-31T17:33:52+04:0005 2011, 17:33:52
0

У меня возникла та же проблема с VS 2010, и я обнаружил, что весь день врезался в стену. Подумав всю ночь, думаю, я нашел причину. Причина в настойчивости. Он только запоминает любое значение, введенное в браузере. Тем не менее, я думаю, что это нарушает обязательный принцип. Если мне разрешено передавать параметр модели в представление, представление должно связать этот параметр, принимая все, что я передаю в текущем состоянии модели.

ответил IMBM 31 MarpmThu, 31 Mar 2011 17:27:16 +04002011-03-31T17:27:16+04:0005 2011, 17:27:16

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132