MVC Html.textbox / dropdown /在回发时不会刷新的内容

时间:2010-06-17 23:00:36

标签: asp.net-mvc-2 postback html-helper

好的,让我们从Html.Textbox开始吧。它应该包含从文件中读取的文本。读取的文件基于用户从下拉列表中选择的内容。

第一次没事。用户从下拉列表中选择一个值。控制器使用该值从文件中读取一些文本,并通过视图模型将该文本返回到视图。一切都很好。

用户从下拉列表中选择另一个值。控制器从文件中读取新值并通过视图模型返回。在视图中设置HTML.TEXTBOX之前调试到LINE会显示模型包含正确的值。但是,当页面显示时,文本框本身仍会显示PREVIOUS值!

如果我从Html.Textbox切换到普通输入,键入=“text”html控件,一切正常。这不是那么难,但我的下拉列表也会发生同样的事情 - 我无法在代码中设置所选的值。它总是回归到最后选择的任何东西。使用动态生成的选项列表呈现“选择”标记很痛苦。我希望能够使用Html.Dropdown。

我在这里想念的是什么?这在webforms中是如此简单!

3 个答案:

答案 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动态更新下拉列表的内容。