【问题标题】:Basic Problem with Asp.net MVC UpdateModel(myClass)Asp.net MVC UpdateModel(myClass) 的基本问题
【发布时间】:2009-09-01 15:29:50
【问题描述】:

在 Asp.net MVC 1 应用程序的控制器中,我想使用 UpdateModel 在控制器中使用 POST 数据填充变量。我看过几十个例子,但即使是最基本的例子对我来说似乎也无声无息地失败了。

这是一个非常基本的示例,但它不起作用。 我做错了什么?

    public class TestInfo
    {
        public string username;
        public string email;
    }

   public class AdminController : Controller
    {

        public ActionResult TestSubmit()
        {
            var test = new TestInfo();
            UpdateModel(test);//all the properties are still null after this executes  
            //TryUpdateModel(test); //this returns true but fields / properties all null
            return Json(test);
        }


    }


//Form Code that generates the POST data
    <form action="/Admin/TestSubmit" method="post">
        <div>
            <fieldset>
                <legend>Account Information</legend>
                <p>
                    <label for="username">Username:</label>
                    <input id="username" name="username" type="text" value="" />
                </p>
                <p>
                    <label for="email">Email:</label>
                    <input id="email" name="email" type="text" value="" />
                </p>
                <p>
                    <input type="submit" value="Login" />
                </p>

            </fieldset>
        </div>
    </form>

【问题讨论】:

  • 感谢大家的快速回复。我喜欢吃完午饭回来看到 4 个答案。我现在正在测试它们。快速旁注。我以史蒂夫·桑德森(Steve Sanderson)的 Pro Asp.net MVC 框架第 374 页为例,它不使用 [AcceptVerbs(HttpVerbs.Post)] 标头或类型化参数。书错了吗?
  • 想通了。书是对的。它只是忽略了提及,在这种情况下,UpdateModel 使用的反射方法仅适用于 Properties,即使它可能适用于当前不适用的字段。对我来说似乎是一个 MVC 错误。属性通常是更好的做法,但对于简单的视图模型,它更容易设置字段的默认值,而不是重新键入所有属性值并在类构造函数中设置默认值。

标签: asp.net-mvc binding controller updatemodel


【解决方案1】:

您似乎正试图让控制器根据表单元素更新模型。试试这个:

    [AcceptVerbs(HttpVerbs.Post)]
    public ActionResult TestSubmit(TestInfo test)
    {
        UpdateModel(test);
        return Json(test);
    }

在您的代码中,您正在创建一个新的 TestModel,而不是让 MVC 运行时从 HttpPost 序列化它。我也让自己陷入了困境,你不是唯一一个!

【讨论】:

  • 这是一个很好的做法,但是使用字段而不是属性是导致我的分配静默失败的原因。
【解决方案2】:

为您的公共字段设置属性:

    public class TestInfo
    {
        public string username {get;set;}
        public string email{get;set;}
    }

【讨论】:

  • UpdateModel 依赖于属性,而不是字段,iirc。
  • 啊错过了。我猜还是要更好地练习
  • 奇怪的是它不适用于字段。猜猜这是我对在构造函数中设置属性默认值所需的额外编码的惩罚:-)
【解决方案3】:

我对 ASP.NET MVC 不太熟悉,但您的 TestSubmit 方法不应该更像这样吗:

public ActionResult TestSubmit(TestInfo test)
{
  UpdateModel(test);
  return Json(test);
}

【讨论】:

    【解决方案4】:

    在控制器中,您应该有两种方法,一种用于响应 GET,另一种用于响应 POST。

    所以,首先要有一个 GET 方法:

    public ActionResult Test ()
    {
        return View (/* add a TestInfo instance here if you're getting it from somewhere - db etc */);
    }
    

    其次,您需要一个 POST 方法:

    [AcceptVerbs(HttpVerbs.Post)]
    public ActionResult Test (TestInfo test)
    {
        return Json (test);
    }
    

    请注意,那里没有 UpdateMethodModelBinder 会为您完成。

    【讨论】:

    • 这些都是很好的最佳实践,但我的问题是使用字段。我测试了您的建议,这是一种拆分获取和发布请求的干净方法
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-14
    相关资源
    最近更新 更多