gpt4 book ai didi

ASP.Net MVC Controller UpdateModel 未更新

转载 作者:行者123 更新时间:2023-12-02 17:02:22 28 4
gpt4 key购买 nike

尝试让 UpdateModel 为我的用户工作。 User 类具有基本的字符串属性,如 CompanyName、FirstName、LastName 等,因此没有什么奇怪的。

这是我的 View 的标题:

<%@ Page Title="" Language="C#" MasterPageFile="~/Views/Shared/Public.Master" Inherits="System.Web.Mvc.ViewPage<User>" %>

他们提交后,在我的 Controller 中,代码如下所示:

[HttpPost]
public ActionResult Edit(string id, FormCollection collection)
{
try
{
User myUser = db.Get<IUserRepository>().Get(id);
UpdateModel(myUser);
db.Update(myUser);

return RedirectToAction("Index", "Home");
}
catch
{
return View();
}
}

传入 FormCollection 的值具有如下值:

[0] "FirstName" string
[1] "LastName" string
[2] "Email" string

这是我的 UserModelBinder (取出了一些错误检查代码),这似乎是问题的根源:

public class UserModelBinder : IModelBinder
{
public object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext)
{
IPrincipal p = controllerContext.HttpContext.User;
User u = db.Get(p.Identity.Name);
return u;
}
}

虽然我从数据库获取的 myUser 具有其所有原始值,但我的 Controller 的 UpdateModel 实际上从未进行任何更改。我读过人们对 ViewModel 的问题以及要使用的前缀,但我只是传递常规数据库对象。

奇怪的是,这个用户编辑是针对我的“公共(public)”区域的,而我已经有一个针对管理区域的用户编辑,它允许管理员更改额外的属性。用户编辑的“管理”区域工作正常,但用户编辑的“公共(public)”区域则不然,即使代码几乎相同。

更新:

这原来是一个自定义 ModelBinding 问题,通过更改我的 UserModelBinding 以从 DefaultModelBinder 派生并添加到我的 BindModel 方法中:

if (bindingContext.Model != null)
return base.BindModel(controllerContext, bindingContext);

一切似乎都正常。

最佳答案

试试这个

public ActionResult Edit(User thisUser)

Id 可能需要来自隐藏字段。

此外,您还需要确保您的字段名称与用户属性名称匹配。

您不需要执行任何其他操作,因为对象中应该包含值。

如果这没有帮助,请告诉我,我将删除此答案

编辑

这是我的更新方法之一

    [HttpPost]
public ActionResult EditCustomer(Customer customer)
{
//ensure that the model is valid and return the errors back to the view if not.
if (!ModelState.IsValid)
return View(customer);

//locate the customer in the database and update the model with the views model.
Customer thisCustomer = customerRepository.Single(x => x.CustomerID == customer.CustomerID);
if (TryUpdateModel<Customer>(thisCustomer))
customerRepository.SaveAll();
else
return View(customer);

//return to the index page if complete
return RedirectToAction("index");
}

编辑2

我的自定义模型 Binder

public class CustomContactUsBinder : DefaultModelBinder
{
protected override void OnModelUpdated(ControllerContext controllerContext, ModelBindingContext bindingContext)
{
ContactFormViewModel contactFormViewModel = bindingContext.Model as ContactFormViewModel;

if (!String.IsNullOrEmpty(contactFormViewModel.Name))
if (contactFormViewModel.Name.Length > 10)
bindingContext.ModelState.AddModelError("Name", "Name is too long. Must be less than 10 characters.");

base.OnModelUpdated(controllerContext, bindingContext);
}
}

关于ASP.Net MVC Controller UpdateModel 未更新,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3774287/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com