试图让UpdateModel适用于我的用户。 User类具有基本的字符串属性,例如CompanyName,FirstName,LastName等,因此没有任何异国情调。

这是我的观点的标题:

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


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

[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拥有其所有原始值,但控制器的UpdateModel从未实际进行任何更改。我已经读过人们对ViewModels以及使用哪个前缀的问题,但我只是传入常规数据库对象。

奇怪的是,此用户编辑是针对我的“公共”区域的,而我已经具有针对“管理”区域的“用户”编辑,它使管理员可以更改其他“属性”。尽管代码几乎相同,但“用户”编辑的“管理员”区域工作正常,但用户编辑的“公共”区域却无法正常工作。

更新:

原来这是一个自定义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

我的自定义模型活页夹

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 - ASP.Net MVC Controller UpdateModel不更新,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/3774287/

10-09 13:21