【问题标题】:Why input elements don't render the value passed in ASP.Net MVC?为什么输入元素不呈现在 ASP.Net MVC 中传递的值?
【发布时间】:2010-04-03 14:58:53
【问题描述】:

这个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(包含发布的值)包含传递的“名称”值,它将使用该值而不是您传递给辅助方法的值。就我而言,我更新了模型,但没有输出更新后的值。

如果我将一个值传递给一个方法,我希望该值被呈现。

我是在这个设计中遗漏了什么还是只是错了?

【问题讨论】:

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


    【解决方案1】:

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

    1. 用户请求某个 URI。
    2. 您的控制器构建了一个模型。
    3. 视图被渲染。此时 ModelState 字典应该为空,因此您传递给 Html.Hidden 的值将被渲染。但是,有问题的功能与用户输入更直接相关,因此请考虑Html.TextBox("someName", Model.SomeValue) 的情况
    4. 现在假设用户输入了一些无效数据。如果您有客户端验证,这将在 POST 之前被捕获,但我们假设您没有,或者用户以某种方式规避了它。

    在这种情况下,处理 POST 的操作将返回一个 ViewResult,从而导致步骤 3 中的视图被重新渲染。但是,用户将看到他们输入的值(以便他们可以修复它)而不是模型对象中的值。这里的想法是,由于类型安全,用户输入的数据可能无法表示为Model.SomeValue 中的值。例如,如果Model.SomeValue 是整数类型,并且用户输入了“ABC”,那么重新呈现用户数据的唯一方法是将其放在其他位置。而那个“其他地方”就是 ModelState。

    重新显示用户的无效数据允许用户修复他们输入的数据并重新发布表单。

    【讨论】:

    • 我同意所有输入控件,但 hidden 不是可见的输入控件。那么隐藏的行为不应该有所不同吗?
    • MVC 无法知道您的隐藏输入是如何使用和设置的。也许您在页面上有一个 JavaScript GUI 控件,它读取/设置隐藏输入以与服务器通信? MVC 一致地对待所有表单元素。
    猜你喜欢
    • 2015-05-05
    • 2012-10-17
    • 1970-01-01
    • 1970-01-01
    • 2013-12-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多