使用自定义模型绑定器时,绑定器会触发并填充结构,但UpdateModel始终会失败

时间:2011-08-16 18:27:24

标签: asp.net-mvc model-view-controller asp.net-mvc-3 model-binding controlleractioninvoker

我有一个网页,我需要返回一个字符串列表并填充一个对象。我将不得不做一些基于非ID整数去除重复的自定义处理。 (不包括在示例中)。

我有一个模型绑定器,当我从Controller参数列表中显式调用它时解析字符串,但UpdateModel总是失败。

更新 如果我将标签更改为workerRequests2,它可以工作。那么如何覆盖被定义为控制器主对象的子对象的对象属性defaultmodelbinder的{​​{1}}?

ModelState中可见的异常是:

workerRequests

实体:

Exception = {"The parameter conversion from type 'System.String' to type
             'Machete.Domain.WorkerRequest' failed because no type converter 
              can convert between these types."}

域对象:

public DbSet<WorkOrder> WorkOrders { get; set; }
public DbSet<WorkerRequest> WorkerRequests { get; set; }

更新

public class WorkOrder : Record
{
    // ID (comes from Record)
    public int EmployerID { get; set; } //included for context
    public virtual Employer Employer { get; set; }  //included for context
    ...
    public virtual ICollection<WorkerRequest> workerRequests { get; set; }
    //
}

的Global.asax:

public class WorkerRequest : Record
{
    //public int ID { get; set; }
    public int WorkOrderID { get; set; }
    public virtual WorkOrder workOrder { get; set; }
    public int WorkerID { get; set; }
    public virtual Worker workerRequested { get; set; }
    public string fullName
    {
        get {
            Person p = this.workerRequested.Person;
                return p.firstname1 + " " +
                     p.firstname2 + " " +
                     p.lastname1 + " " +
                     p.lastname2;
            }
    }
}

更新我正在使用选择列表并计划执行一些javascript来自动选择所有选项。我需要浏览器来构建一个整数键列表(我有其他js对象在做),我计划将部分填充的workerRequest对象传递给服务级别以同步列表。 HTML创建列表:

protected void Application_Start()
{   ...
    ModelBinders.Binders.Add(typeof(List<WorkerRequest>), new workerRequestBinder());
    ...
}

以下是Controller操作:

<select id="workerRequests" multiple="multiple" name="workerRequests" tabindex="12" class="valid">
    <option value="32">Van</option>
    <option value="29">Worker buses</option>
    <option value="30">Worker drives</option>
    <option value="31">Employer Picks up</option>
    <option value="86">Worker walks</option>
</select>

Custom Model Binder:

    public ActionResult Edit(int id, 
                             FormCollection collection, 
                             string userName, 
                             List<WorkerRequest> workerRequests)
    {
        //At this point, workerRequests is populated.
        WorkOrder workOrder = workOrderService.GetWorkOrder(id);
        TryUpdateModel(workOrder);
        //Update model is failing
        if (ModelState.IsValid)  //Found the exception in here
        {
            workOrderService.SaveWorkOrder(workOrder, userName);
            return RedirectToAction("Index", new { EmployerID = workOrder.EmployerID });
        }
        else
        {
            levent.Level = LogLevel.Error; levent.Message = "TryUpdateModel failed";
            levent.Properties["RecordID"] = workOrder.ID; log.Log(levent);
            return PartialView("Edit", workOrder);
        }
    }

问题:

[10,000 ft]我做错了什么?我在MVC范例中滥用了什么?

[1000 ft]我如何剖析UpdateModel正在做什么来弄清楚这里?

[100 ft]让UpdateModel使用我的自定义绑定器缺少什么?

0 个答案:

没有答案