这算是ASP.NET MVC的一个大BUG吗?

这是昨天一个同事遇到的问题,我觉得这是一个蛮大的问题,而且应该不是ASP.NET MVC的设计者有意为之,换言之,这可能是ASP.NET MVC的一个大Bug。StackOverflow上也有对这个问题的描述http://stackoverflow.com/questions/1775170/asp-net-mvc-modelstate-clear

闲话少说,我们通过一个简单的问题重新这个问题。首先我们 定义了如下一个默认的HomeController,它具有一个默认Action方法Index。该方法接受一个类型为DemoModel的参数,定义其中的逻辑非常简单:我们对该参数的三个属性略加修改后,将其作为Model呈现在对应的View中。

public class HomeController : Controller
{
    public ActionResult Index(DemoModel model)
    {

        model.Foo += ":Changed";
        model.Bar += ":Changed";
        model.Baz += ":Changed";
        return View("index", mode);
    }
}
public class DemoModel
{
    public string Foo { get; set; }
    public string Bar { get; set; }
    public string Baz { get; set; }
}

对于Action方法Index对应的View(Index.cshtml),我们可以采用如下三种定义方式将Model对象以编译模式呈现出来。

//第一种形式
@model DemoModel
@Html.LabelFor(m=>m.Foo)
@Html.TextBoxFor(m => m.Foo)
@Html.LabelFor(m => m.Bar)
@Html.TextBoxFor(m => m.Bar)
@Html.LabelFor(m => m.Baz)
@Html.TextBoxFor(m => m.Baz)

//第二种形式
@model DemoModel
@Html.LabelFor(m=>m.Foo)
@Html.EditorFor (m => m.Foo)
@Html.LabelFor(m => m.Bar)
@Html.EditorFor (m => m.Bar)
@Html.LabelFor(m => m.Baz)
@Html.EditorFor (m => m.Baz)
//第三种形式
@model DemoModel
@Html.EditorForModel

现在我们运行该程序,并通过Query String的形式提供作为Action方法Index参数的数据(?foo=123&bar=456&baz=789),我们可以看到界面上呈现出来的总是原始值,也就是说我们在Action方法Index中对原始数据的修改没有起到任何效果。

通过查看ASP.NET MVC框架自身的代码,我想这个问题的根源应该源于InputExtensions类型的InputHelper方法。如下所示,当InputHelper在指定表单元素值得时候,会先从当前ModelState中获取,如果该值在ModelState中不存在,才会从当前ViewData中获取。对于本例来说,ModelState中的值是原始值,ViewData的值采用修改后的值。

public static class InputExtensions
{
    private static MvcHtmlString InputHelper(HtmlHelper htmlHelper, InputType inputType, ModelMetadata metadata, string name, object value, bool useViewData, bool isChecked, bool setId, bool isExplicitValue, string format, IDictionary<string, object> htmlAttributes);
}
private static MvcHtmlString InputHelper(HtmlHelper htmlHelper, InputType inputType, ModelMetadata metadata, string name, object value, bool useViewData, bool isChecked, bool setId, bool isExplicitValue, string format, IDictionary<string, object> htmlAttributes)
{
    …
    switch (inputType)
    {
       …
        default:
        {
            string str4 = (string) htmlHelper.GetModelStateValue(fullHtmlFieldName, typeof(string));
            tagBuilder.MergeAttribute("value", str4 ?? (useViewData ? htmlHelper.EvalString(fullHtmlFieldName, format) : str2), isExplicitValue);
            goto Label_016C;
        }
    }
…
}
时间: 2024-10-27 12:37:55

这算是ASP.NET MVC的一个大BUG吗?的相关文章

ASP.NET MVC提交一个较复杂对象至WCF Service

前一篇<jQuery.Ajax()执行WCF Service的方法>http://www.cnblogs.com/insus/p/3727875.html 我们有练习在asp.net mvc应用程序中,POST 数据去wcf service并执行方法.本篇的练习是提交较复对象至wcf service执行方法.前一篇中,它只传递两个参数.如果我们平时开发,需要传递过多的参数时,那得需要写很多个参数.因此产生此篇,把较多个参数,创建为一个对象.然后只传递这个对象至wcf service即可. 下面

[ASP.NET MVC2 系列] ASP.Net MVC教程之《在15分钟内用ASP.Net MVC创建一个电影数据库应用程序》

[ASP.NET MVC2 系列]      [ASP.NET MVC2 系列] ASP.Net MVC教程之<在15分钟内用ASP.Net MVC创建一个电影数据库应用程序>      [ASP.NET MVC2 系列] ASP.Net MVC教程之<ASP.NET MVC 概述>     [ASP.NET MVC2 系列] 理解MVC应用程序的执行过程     [ASP.NET MVC2 系列] ASP.NET MVC Routing概述      [ASP.NET MVC2

在asp.net mvc中上传大文件

在asp.net mvc 页面里上传大文件到服务器端,需要如下步骤: 1. 在Control类里添加get 和 post 方法 1 // get method 2 public ActionResult Upload() 3 { 4 return View(); 5 } 6 7 // This action handles the form POST and the upload 8 [HttpPost] 9 public ActionResult Upload(HttpPostedFileBa

[转]ASP.NET MVC Json()处理大数据异常解决方法 json maxjsonlength

本文转自:http://blog.csdn.net/blacksource/article/details/18797055 先对项目做个简单介绍: 整个项目采用微软的ASP.NET MVC3进行开发,前端显示采用EasyUI框架,图表的显示用的是Highcharts,主要进行曲线图的绘制,这样比较形象地描绘出变化的趋势.由于数据量比较大(大于1000,000条记录),而highcharts接受的数据类型为json格式,所以controller从数据库中取出的数据需要先格式化成json,然后再传

ASP.NET MVC 的一个配置节点

环境: IIS 7.5,IIS 集成模式, VS 2012,Chrome.    用VS新建一个MVC4项目时,会在根目录下的web.config和view 目录下的web.config文件里自动添加<add key="webpages:Enabled" value="false" />这样一个节点.    这表示什么意思,从字面上很难看出来.于是google了一把.大概意思是说禁止你直接访问view目录下面的.cshtml和.vbhtml这样的文件(比

asp.net mvc 4 json大数据异常 提示JSON字符长度超出限制的异常

今天客户突然过来找我说在后台添加了一篇超长的文章后,所有后台的文章都显示不出来了.后台的前端显示是用easyui的,返回的数据全是用json.根据客户的描述进行了同样的操作后,在firebug下发现ajax返回的异常 “序列化或JSON的JavaScriptSerializer过程中出现错误.字符串的长度超过上maxJsonLength属性设置的值” 这个异常是在执行MVC中的JsonResult的时抛出的,根据异常 的Message得知是序列化的字符串超出了maxJsonLength的限制.并

新的框架,新的感觉ASP.NET MVC 分享一个简单快速适合新手的框架

在ASP.NET世界中摸爬滚打好几年,用过了各种框架,在最初的ASP.NET web from 到现在的MVC 在起初的经典三层,到现在的MVC  IOC  注入 . 突然发现,有些时候真不是跟风用一些框架就好,   那到底用什么框架呢,我个人认为,只要自己用起来哦哦顺手就是最好的框架. 下面就分享下我自己写的框架, 实际上也是经典的三层模式+工厂模式 后期会增加支持Mssql,mysql ORM我用的是EF+Dapper    EF更多的做修改,删除,添加操作    Dapper更多做的是查询

ASP.NET MVC实现一个用户只能登录一次 单用户登录

现在许多网站都要求登录后才能进行进一步的操作,当不允许多用户同时登录一个帐号时,就需要一种机制,当再登录一个相同的帐号时,前面登录的人被挤下线,或者禁止后面的人登录.这里实现的是前一种功能. 网上有许多文章都有描述如何实现该功能,看过之后,想着自己也动手记录一下吧,这里是参考的原文地址:http://www.cnblogs.com/f23wangj/p/4984302.html 实现原理:在服务器端记录登录的用户ID+SessionID,当重复登录时,根据用户ID用新的SessionID替换掉旧

asp.net mvc 设置一个action的访问人数,达到上线排队

/// <summary> /// 1,对访问此action的用户进行异步处理,然后将此异步加入到全局的list当中, /// 再等待异步处理完成,如果完成,将此异步操作从全局的list中删除,给前端返回处理结果 /// 2,设置全局list要存放的处理人数 /// 3,如果达到上限,直接给用户返回请排队,然后全端排队等待,等待五分钟之后接着提交 /// </summary> /// <returns></returns> public string Ind