Проблемы ASP.NET MVC2 с привязкой модели и Html.Textbox ()

Привязка модели ASP.NET MVC все еще нова для меня, и я пытаюсь понять, как именно она работает. Прямо сейчас у меня проблемы с функцией Html.Textbox ()

В частности, у меня есть представление, в котором я установил для Html.Textbox значение как в «Get», так и в «Post». Он отлично настраивается в «Get», но после того, как пользователь отправляет значение во время «Post», я приказываю классу изменить одно из значений внутри на основе другого отправленного значения.

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

Прослеживая, я вижу, что значение фактически изменилось, как ожидалось, как в Модели, так и в Представлении, но когда оно отображается на моем экране после «Публикации», значение не отображается в том виде, в каком оно было изменено. Вместо этого это то, что было установлено изначально.

Вот мой упрощенный пример:

Вид показывает:

  • Раскрывающийся список с элементами из списка выбора (предварительно выбран как «Другое»)
  • текстовое поле только для чтения (с предварительно загруженным значением 0)
  • Отправить кнопку

Пользователь должен выбрать новое значение из раскрывающегося списка и нажать кнопку «Отправить». Метод «Post» в контроллере берет новое значение из раскрывающегося списка, изменяет значение в текстовом поле «Только для чтения» и повторно отображается.

(Да, со временем я сделаю это и с JQuery ...)

Вот мой образец класса модели:

public class SampleSubmission
{
    public string Name { get; set; }
    public int Volume { get; set; }
    public readonly SortedList<string, int> NameVolumeList = new SortedList<string, int>();
    // Standard Constructor
    public SampleSubmission()
    {
        NameVolumeList.Add("Sample1", 10);
        NameVolumeList.Add("Sample2", 20);
        NameVolumeList.Add("Sample3", 50);
        NameVolumeList.Add("Other", 0);
        this.Name = NameVolumeList.Keys[0];
        this.Volume = NameVolumeList[Name];
    }
    // Copy Constructor
    public SampleSubmission(SampleSubmission samSub) : this()
    {
        this.Name = samSub.Name;
        this.Volume = NameVolumeList[Name];
    }
}

Вот контроллер:

public class SampleSubmissionController : Controller
{
    [AcceptVerbs(HttpVerbs.Get)]
    public ActionResult Index()
    {
        SampleSubmission sampleSub = new SampleSubmission();
        return View(sampleSub);
    }

    [AcceptVerbs(HttpVerbs.Post)]
    public ActionResult Index(SampleSubmission sampleSub)
    {
        SampleSubmission samSub = new SampleSubmission(sampleSub);
        return View(samSub);
    }
}

Вот вид:

<%@ Page Title="" Language="C#" MasterPageFile="~/Views/Shared/Site.Master" 
Inherits="System.Web.Mvc.ViewPage<MvcModelBindTest.Models.SampleSubmission>" %>

<asp:Content ID="Content2" ContentPlaceHolderID="MainContent" runat="server">
<% using (Html.BeginForm()) {  %>
<%= Html.DropDownList("Name", new SelectList(Model.NameVolumeList.Keys.ToList())) %>
<%= Html.TextBox("Volume",Model.Volume) %>
<input type="submit" name="pick" id="pick" value="Pick" /> <% } %>
</asp:Content>

Есть идеи, почему не отображается новое значение?

РЕДАКТИРОВАТЬ:

Чтобы решить эту проблему, я прочитал ссылку, предоставленную "jfar", и сделал однострочное изменение.

    [AcceptVerbs(HttpVerbs.Post)]
    public ActionResult Index(SampleSubmission sampleSub)
    {
        SampleSubmission samSub = new SampleSubmission(sampleSub);
        // Reset Model Value
        ModelState.SetModelValue("Volume", new ValueProviderResult(
           samSub.Volume, "", System.Globalization.CultureInfo.CurrentCulture));
        return View(samSub);
    }

Это определенно работает. К сожалению, мне кажется, что это грубый взлом. Что, если бы мне пришлось обновить значения нескольких полей? Должен быть лучший (более простой?) Способ сделать это.

EDIT2: нашел свой ответ. Увидеть ниже...


person Pretzel    schedule 22.09.2010    source источник


Ответы (3)


От: Как очистить текстовые поля, определенные с помощью помощников MVC HTML

"HTMLHelper сначала смотрит на ModelState и ViewData, чтобы увидеть, соответствуют ли какие-либо значения их ключу, а затем, наконец, использует то значение, которое вы им предоставляете.

Если вам нужно сбросить значение текстового поля, вам также необходимо очистить запись ModelState с помощью соответствующего ключа. Другой альтернативой является перенаправление на ту же страницу вместо простого рендеринга представления с помощью javascript или MVC.

person John Farrell    schedule 22.09.2010
comment
Да, новые ценности - это именно то, чем я хочу заниматься. Я прочитал ссылку и ответы, которые дала пользователь Cynthia. Я исправил проблему и отметил ее выше, но мне не нравится, как это происходит. Похоже на взлом. - person Pretzel; 22.09.2010
comment
@TheVillageIdiot, ну да, но концепция та же. @Pretzel, вы, вероятно, воспользуетесь этой функцией при сохранении состояния. Также довольно легко написать свои собственные помощники HTML. Совершенно уверен, что есть существующие библиотеки, которые вы тоже можете использовать в Google. - person John Farrell; 23.09.2010

Я нашел ответ на свой вопрос, когда наткнулся на другую переменную, которую нужно было сбросить. Когда я смотрел на структуру данных, я понял, что мне нужно было изначальное состояние, в котором не было ключей в ModelState.

        ModelState.Remove(key);

Где «ключ» - это значение, которое вы пытаетесь сбросить.

person Pretzel    schedule 06.10.2010

Другой простой обходной путь - вместо

<%= Html.TextBox("Volume",Model.Volume) %>

Использовать тег ввода HTML

<input id="Volume" name ="Volume" value="@Model.Volume" />
person Jomy John    schedule 21.03.2013