为什么输入元素不呈现ASP.Net MVC中传递的值?

时间:2010-03-19 14:49:41

标签: asp.net asp.net-mvc-2

post问这个问题,但没有给出答案,所以我想我会以不同的方式提问。

我有一个从模型中呈现隐藏值的页面:

<%=Html.Hidden("myName", model.myValue) %>

由于我在value参数中传递了一个值,你会认为它会输出该值,但事实并非如此。

渲染输入字段的代码如下:

string attemptedValue = (string)htmlHelper.GetModelStateValue(name, typeof(string));
tagBuilder.MergeAttribute("value", attemptedValue ?? ((useViewData) ? htmlHelper.EvalString(name) : valueParameter), isExplicitValue);

基本上,如果ModelState(包含已发布的值)包含传递的“name”的值,它将使用该值而不是传递给helper方法的值。就我而言,我更新了模型并且没有输出更新的值。

如果我将值传递给方法,我希望渲染该值。

我错过了这个设计中的某些内容还是错了?

1 个答案:

答案 0 :(得分:2)

这是设计的。这是预期的流程:

  1. 用户请求某个URI。
  2. 您的控制器会构建一个模型。
  3. 呈现视图。此时ModelState字典应为空,因此将传递传递给Html.Hidden的值。但是,有问题的功能与用户输入更直接相关,因此请考虑Html.TextBox("someName", Model.SomeValue)
  4. 的情况
  5. 现在假设用户输入了一些无效数据。如果你有一个客户端验证,这将在POST之前被捕获,但让我们假装你没有,或者用户以某种方式绕过它。
  6. 在这种情况下,处理POST的操作将返回ViewResult,从而导致重新呈现步骤3中的视图。但是,用户将看到他们输入的值(因此他们可以修复它)而不是模型对象的值。这里的想法是,由于类型安全,用户输入的数据可能无法表示为Model.SomeValue中的值。例如,如果Model.SomeValue的类型为整数,并且用户输入了“ABC”,则重新呈现用户数据的唯一方法是将其放在其他位置。那个“其他地方”就是ModelState。

    重新显示用户的无效数据,用户可以修改他们输入的数据并重新发布表单。