我有一个网页,我需要返回一个字符串列表并填充一个对象。我将不得不做一些基于非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使用我的自定义绑定器缺少什么?