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