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