TryUpdateModel在属性值更改后不更新对象

时间:2010-09-18 11:34:31

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

我正在使用MVC 2和EF4。我有一个显示我的应用程序(类)属性的视图。并非所有属性都显示在视图中。单击提交按钮后,需要设置一些属性。

我正在通过客户端验证,但我的服务器验证仍然失败。我在Application操作中收到了CreateApplication个对象,我更新了一个属性,并进行了ModelState.IsValid检查。它仍然是假的。我在错误列表中循环,它使用Required数据注释显示我在SubmitterEmployeeNumber属性上设置的错误文本。我确实设置了它并且我确实更新了我的模型,但验证仍然失败。这是我的代码:

[HttpPost]
public ActionResult CreateApplication(Application application)
{
   application.SubmitterEmployeeNumber = "123456";

   TryUpdateModel(application);

   if (ModelState.IsValid)
   {
   }
}

以下是我显示视图的方式:

public ActionResult CreateApplication()
{
   var viewModel = new ApplicationViewModel(new Application(), db.AccountTypes);

   return View(viewModel);
}

如何在绑定后设置属性后才能通过验证?

UpdateModelTryUpdateModel之间有什么区别?我什么时候需要使用它们?

编辑:

我将操作的名称更改为:

[HttpPost]
public ActionResult CreateApp()
{
   var application = new Application
   {
      ApplicationStateID = 1,
      SubmitterEmployeeNumber = "123456"
   };

   if (TryUpdateModel(application))
   {
      int success = 0;
   }
}

以下是我的观点:

<% using (Html.BeginForm("CreateApp", "Application")) {%>

TryUpdateModel仍然验证为false。我放入int success = 0;只是为了看它是否会进入它但它没有。

1 个答案:

答案 0 :(得分:1)

[HttpPost]
public ActionResult CreateApplication()
{
    var application = new Application 
    {
        SubmitterEmployeeNumber = "123456"
    };
    if (TryUpdateModel(application)) 
    {
        // The model is valid => submit values to the database
        return RedirectToAction("Success");
    }
    return View(application);
}

更新:由于评论部分中的许多混淆,这里有一个完整的工作示例。

型号:

public class Application
{
    [Required]
    public int? ApplicationStateID { get; set; }

    [Required]
    public string SubmitterEmployeeNumber { get; set; }

    [Required]
    public string Foo { get; set; }

    [Required]
    public string Bar { get; set; }
}

控制器:

[HandleError]
public class HomeController : Controller
{
    public ActionResult Index()
    {
        var application = new Application();
        return View(application);
    }

    [HttpPost]
    [ActionName("Index")]
    public ActionResult Create()
    {
        var application = new Application
        {
            ApplicationStateID = 1,
            SubmitterEmployeeNumber = "123456"
        };
        if (TryUpdateModel(application))
        {
            // success => update database, etc...
            return Content("yupee");
        }

        // failure => redisplay view to fix errors
        return View(application);
    }
}

查看:

<% using (Html.BeginForm()) { %>
    <div>
        <%: Html.LabelFor(x => x.Foo) %>
        <%: Html.TextBoxFor(x => x.Foo) %>
        <%: Html.ValidationMessageFor(x => x.Foo) %>
    </div>

    <div>
        <%: Html.LabelFor(x => x.Bar) %>
        <%: Html.TextBoxFor(x => x.Bar) %>
        <%: Html.ValidationMessageFor(x => x.Bar) %>
    </div>

    <input type="submit" value="GO GO" />
<% } %>

希望这可以解决问题。