ASP.NET MVC2 - проблема с привязкой модели и Html.Textbox () - PullRequest
2 голосов
/ 22 сентября 2010

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

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

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

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

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

В представлении отображается:

  • Раскрывающийся список с элементами из списка SelectList (предварительно выбран как «Другой»)
  • a Текстовое поле только для чтения (с предварительно загруженным значением 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" и сделал изменение в 1 строку.

    [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: Найден мой ответ.Смотри ниже ...

Ответы [ 3 ]

1 голос
/ 07 октября 2010

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

        ModelState.Remove(key);

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

1 голос
/ 22 сентября 2010

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

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

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

0 голосов
/ 21 марта 2013

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

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

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

<input id="Volume" name ="Volume" value="@Model.Volume" />
...