请问一个ASP.Net MVC的基础概念有关问题

请教一个ASP.Net MVC的基础概念问题
本帖最后由 sknice 于 2015-01-01 20:02:07 编辑
第一个问题:
View类的代码如下:

@using (Html.BeginForm("HelloModelTest", "Home", FormMethod.Post))
{
     @Html.TextBox("Name");
     @Html.TextBox("Text");
    <input type="submit" value="提交" />
}


Controller类的代码如下:

public ActionResult HelloModelTest()
        {
            HelloModel model = new HelloModel();
            return View();
        }
        [HttpPost]
        public ActionResult HelloModelTest( string name, string text)
        {
            ActionResult result = View();
            return result;
        }


页面运行后,在name文本框和text文本框输入值后点击“提交”按钮,数据提交到服务器返回后,
页面上两个文本框中仍然保存着刚才输入的值。
但是如果我把Controller类的方法稍作修改,如下:

public ActionResult HelloModelTest()
        {
            HelloModel model = new HelloModel();
            return View();
        }
        [HttpPost]
        public ActionResult HelloModelTest( FormCollection fc)//参数类型做了修改
        {
            ActionResult result = View();
            return result;
        }

这时候,页面运行后,在name文本框和text文本框输入值后点击“提交”按钮,数据提交到服务器返回后,
页面上两个文本框会丢失刚才输入的值。
这是为什么 ? 

第二个问题:
View类的代码稍作修改如下:

@using (Html.BeginForm("HelloModelTest", "Home", FormMethod.Post))
{
      <input type="text" name="Name" />
    <input type="text" name="text" />
    <input type="submit" value="提交" />
}


Controller类的代码代码不变如下:

public ActionResult HelloModelTest()
        {
            HelloModel model = new HelloModel();
            return View();
        }
        [HttpPost]
        public ActionResult HelloModelTest( string name, string text)
        {
            ActionResult result = View();
            return result;
        }


这时候,页面运行后,在name文本框和text文本框输入值后点击“提交”按钮,数据提交到服务器返回后,
页面上两个文本框同样也会丢失刚才输入的值。
这又是怎么回事??
------解决思路----------------------
楼主的钻研精神挺令人佩服,我从没有注意过这个问题,看了这个帖子,特意搜了一下,发现这篇博客说到这个问题:
http://weblog.west-wind.com/posts/2012/Apr/20/ASPNET-MVC-Postbacks-and-HtmlHelper-Controls-ignoring-Model-Changes
答案是HtmlHelper的TextBox方法会从ModelState中获取相应的值,而ModelState是用于对Model进行验证的,用FormCollection做参数的话,ModelState就是空的,也就是asp.net mvc无法验证Model,所以也就无法在回发后还原用户输入的内容。至于用input Html标签,那和asp.net mvc的ModelState就不相干了,也就不可能从ModelState中还原回发前的内容。

你也可以发扬一下你的刨根问底精神,直接研究源代码:
http://aspnetwebstack.codeplex.com/SourceControl/latest#src/System.Web.Mvc/Html/InputExtensions.cs
------解决思路----------------------
public ActionResult HelloModelTest( FormCollection fc)
        {
    var model = new 你的模型类();
    UpdateModel(model);
    return View(model);
        }