好的,让我们从Html.Textbox开始吧。它应该包含从文件中读取的文本。读取的文件基于用户从下拉列表中选择的内容。
第一次没事。用户从下拉列表中选择一个值。控制器使用该值从文件中读取一些文本,并通过视图模型将该文本返回到视图。一切都很好。
用户从下拉列表中选择另一个值。控制器从文件中读取新值并通过视图模型返回。在视图中设置HTML.TEXTBOX之前调试到LINE会显示模型包含正确的值。但是,当页面显示时,文本框本身仍会显示PREVIOUS值!
如果我从Html.Textbox切换到普通输入,键入=“text”html控件,一切正常。这不是那么难,但我的下拉列表也会发生同样的事情 - 我无法在代码中设置所选的值。它总是回归到最后选择的任何东西。使用动态生成的选项列表呈现“选择”标记很痛苦。我希望能够使用Html.Dropdown。
我在这里想念的是什么?这在webforms中是如此简单!
答案 0 :(得分:1)
发布表单时,发布的值会被放入ModelState
。当HtmlHelper
呈现html iunput元素时,例如Html.TextBoxFor(x => x.FirstName)
,它会搜索各个位置以获取文本框的值... ModelState
位于位置列表中的ViewData.Model
之前。因此,之前发布的值将显示在您的文本框中。
要解决此问题,您可以清除ModelState
值或更新ModelState
值。但我有点认为这是解决问题的一种黑客方式。
真正的问题更多地与帖子和请求的流程有关。我个人会调查并可能实现PRG(Post Redirect Get)模式。
HTHS,
查尔斯
答案 1 :(得分:0)
查尔斯/查理诺说:
模型绑定更新ModelState
对象,该对象包含在模型绑定期间收集的验证和模型绑定错误。
在操作方法中,已经发生了模型绑定以更新模型,并生成了ModelState
对象。如果现在更新操作内部模型的值,则还必须手动更新模型状态(因为帮助程序使用它来生成HTML)。以下是一个例子:
model.CaptchaIsValid = CaptchaService.ValidateAndExpireCaptcha(model.CaptchaAttempt);
if (!model.CaptchaIsValid)
{
ModelState.AddModelError("CaptchaAttempt", "Incorrect - please try again");
}
// I'll clear the value on each attempt, to force them to re-enter a CAPTCHA.
model.CaptchaAttempt = string.Empty;
// Since I updated the model, I must create a new ValueProvider result...
ValueProviderResult clearedValue = new ValueProviderResult(
model.CaptchaAttempt,
model.CaptchaAttempt,
CultureInfo.CurrentCulture);
// ... and update the ModelState's value.
ModelState.SetModelValue("CaptchaAttempt", clearedValue);
答案 2 :(得分:-1)
我在这里看到的最大问题是你正在尝试在MVC中进行回发。这个模型真的不受支持,实际上比它的价值更麻烦(因为你似乎发现了)。我建议使用Ajax动态更新下拉列表的内容。