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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了TryUpdateModel在属性值更改后不更新对象相关的知识,希望对你有一定的参考价值。

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

我正在通过客户端验证,但我的服务器验证仍然失败。我在Application动作中收到一个CreateApplication对象,我更新了一个属性,然后进行ModelState.IsValid检查。它仍然是假的。我在错误列表中循环,它显示我使用必需数据注释在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仍然被证实为假。我放入int success = 0;只是为了看它是否会进入它,但事实并非如此。

答案
[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" />
<% } %>

希望这可以解决问题。

以上是关于TryUpdateModel在属性值更改后不更新对象的主要内容,如果未能解决你的问题,请参考以下文章

React 功能组件在状态更改后不更新

为啥全局对象属性在函数后不更新?

Docker撰写更改后不更新图像

Kendo Grid:外键下拉菜单在更新后不更新网格单元格

为啥 Bindinglist 在数据库更改后不更新?

Xamarin.Forms绑定初始值后不更新